SOURCE

//需求介绍
//给一个年份和第几周,计算出这周是从几号到几号
function yearDay(long){
        var time = new Date(long * 1000)
        var year = time.getFullYear();
        var month = time.getMonth()+1;
        var week =null;
        var datestart = time.getDate() ;
        var dateend =null;
        var yearday = {year,month,week,datestart,dateend}
        return yearday
    }
    //计算一年中的每一周都是从几号到几号
    //第一周为1月1日到 本年的 第一个周日
    //第二周为 本年的 第一个周一 往后推到周日
    //以此类推 再往后推52周。。。
    //如果最后一周在12月31日之前,则本年有垮了54周,反之53周
    //12月31 日不论是周几,都算为本周的最后一天
    //参数年份 ,函数返回一个数组,数组里的对象包含 这一周的开始日期和结束日期
function whichWeek(year){
    var d = new Date(year, 0, 1);
    console.log("d:"+d)
    console.log("d.getDay():"+d.getDay())
    while (d.getDay() != 1) {
        d.setDate(d.getDate() + 1);
    }
    let arr = []
    console.log("arr.length:"+arr.length);
    let longnum = d.setDate(d.getDate())
    console.log("longnum:"+longnum)
    console.log("+new Date(year, 0, 1):"+ +new Date(year, 0, 1))
    if(longnum > +new Date(year, 0, 1)){//不足一周7天
        console.log("-----------第一周(不足7周)---------")
        let obj = yearDay(+new Date(year, 0, 1) / 1000)
        let last = yearDay( longnum / 1000 - 86400)
        console.log("obj:"+obj["year"]+obj["month"]+obj["date"])
        console.log("last:"+last["year"]+last["month"]+last["date"])
        arr.push(obj)
        console.log("arr.length:"+arr.length);
    }
    console.log("-----------第二周(第一周不足7天,此为第二周,足七天为第二周)---------")
    let oneitem = yearDay(longnum / 1000)
    console.log("oneitem:"+oneitem["year"]+oneitem["month"]+oneitem["date"])
    let last = yearDay( longnum / 1000 + 86400 * 6)
    console.log("last:"+last["year"]+last["month"]+last["date"])
    arr.push(oneitem)
    var lastStr
    console.log("-----------中间的完整周---------")
    for(var i = 0 ; i<51 ;i++){
        let long = d.setDate(d.getDate() + 7)
        let obj = yearDay( long / 1000)
        console.log("obj:"+obj["year"]+obj["month"]+obj["date"])
        let last = yearDay( long / 1000 + 86400 * 6)
        console.log("last:"+last["year"]+last["month"]+last["date"])
        lastStr = long + 86400000 * 6
        arr.push(obj)
    }
    console.log("-----------最后一周---------")
    if(lastStr < +new Date(year + 1, 0, 1)){ 
        console.log("-----------如果不是完整周---------")       
        let obj = yearDay(lastStr / 1000 + 86400)
        let last = yearDay(+new Date(year + 1, 0, 1) / 1000 - 86400)
        console.log("obj:"+obj["year"]+obj["month"]+obj["date"])
        console.log("last:"+last["year"]+last["month"]+last["date"])
        arr.push(obj)
    }else{
        console.log("-----------如果是完整周---------")  
        // arr[arr.length-1].last = yearDay(+new Date(year + 1, 0, 1) / 1000 - 86400)
        let last = yearDay(+new Date(year + 1, 0, 1) / 1000 - 86400)
        console.log("last:"+last["year"]+last["month"]+last["date"])
    }
    return arr
}
//测试版
function whichWeek2(year){
    var lastStr
    var d = new Date(year, 0, 1);
    while (d.getDay() != 1) {
        d.setDate(d.getDate() + 1);
    }
    let arr = []
    let longnum = d.setDate(d.getDate())
    if(longnum > +new Date(year, 0, 1)){//不足一周7天
        let obj = yearDay(+new Date(year, 0, 1) / 1000)
        let last = yearDay( longnum / 1000 - 86400)
        if(last.datestart-obj.datestart>2){
            obj.week =arr.length+1;
            obj.week =arr.length+1;
            obj.dateend = last["datestart"];
            arr.push(obj)
        }
    }
    let oneitem = yearDay(longnum / 1000)
    let last = yearDay( longnum / 1000 + 86400 * 6)
    oneitem.week =arr.length+1;
    oneitem.dateend = last["datestart"];
    arr.push(oneitem)
    for(var i = 0 ; i<51 ;i++){
        let long = d.setDate(d.getDate() + 7)
        let obj = yearDay( long / 1000)
        let last = yearDay( long / 1000 + 86400 * 6)
        obj.week =arr.length+1;
        obj.dateend = last["datestart"];
        lastStr = long + 86400000 * 6
        arr.push(obj)
    }
    if(lastStr < +new Date(year + 1, 0, 1)){     
        let obj = yearDay(lastStr / 1000 + 86400)
        let last = yearDay(+new Date(year + 1, 0, 1) / 1000 - 86400)
        if(last.datestart-obj.datestart>3){
            obj.week =arr.length+1;
            obj.dateend = last["datestart"];
            arr.push(obj)
        }
    }
    else{
        let last = yearDay(+new Date(year + 1, 0, 1) / 1000 - 86400)
        arr[arr.length-1].dateend = last["datestart"];
    }
    return arr
}
//例如 2012 年就跨了54周,也有很多是53周的
let week = whichWeek2(2023)
console.log(week)
console 命令行工具 X clear

                    
>
console