算出當年的某一天是第幾周並算出周的範圍

前兩天公司作項目遇到一個需求,當選擇某一天向後臺發請求時,應傳入開始時間和結束時間,這裏就要計算出當日所在周的一個範圍才能夠,因而我翻江倒海百度各類找,發現資源有點少,另外有些代碼有坑,算法

最後,各取所長,加上我修改了一下,算法總算能夠用了,在這裏分享給你們spa

首先項目是 angular ,組件是 NG-ZORRO   https://ng.ant.design/docs/introduce/zh 參考code

這個日期組件使用周類型的只會返回當日是所在年的第幾周對象

整理後的算法blog

 

/**
         *    返回某年某月周次範圍
         *    @param year  年份
         *    @param weeks 周次
         *    @return  返回周次的日期範圍
         */
     getXDate(year,weeks):any{
            let date = new Date(year,0,1); 
            let time = date.getTime(); 
            // 獲取當前星期幾,0:星期一 。。。。
            let _week = date.getDay();
            //當這一年的1月1日爲週日時則本年有54周,不然沒有54周,沒有則去除第54周的提示
            if(_week!=0){//一年53周狀況
                        if(weeks==54){
                            return '今年沒有54周';
                        }
                        let cnt=0;// 獲取距離週末的天數
                        if(_week==0){
                            cnt = 7;
                        }else if(_week==1){
                            cnt = 6;
                        }else if(_week==2){
                            cnt = 5;
                        }else if(_week==3){
                            cnt = 4;
                        }else if(_week==4){
                            cnt = 3;
                        }else if(_week==5){
                            cnt = 2;
                        }else if(_week==6){
                            cnt = 1;
                        }
                        cnt += 1;//加1表示以星期一爲一週的第一天
                        // 將這個長整形時間加上第N周的時間偏移
                        time += cnt*24*3600000; //第2周開始時間
                        
                        let nextYear = new Date(parseInt(year,10)+1,0,1);
                        let nextWeek = nextYear.getDay();
                        let lastcnt = 0;//獲取最後一週開始時間到週末的天數
                        if(nextWeek==0){
                            lastcnt = 6;
                        }else if(nextWeek==1){
                            lastcnt = 0;
                        }else if(nextWeek==2){
                            lastcnt = 1;
                        }else if(nextWeek==3){
                            lastcnt = 2;
                        }else if(nextWeek==4){
                            lastcnt = 3;
                        }else if(nextWeek==5){
                            lastcnt = 4;
                        }else if(nextWeek==6){
                            lastcnt = 5;
                        }
                        if(weeks==1){//第1周特殊處理
                            // 爲日期對象 date 從新設置成時間 time 
                            let start = date.toLocaleDateString(); 
                            date.setTime(time-24*3600000); 
                            return start +'--'+ date.toLocaleDateString(); 
                        }else if(weeks==53){//第53周特殊處理
                            let start = time+(weeks-2)*7*24*3600000; //第53周開始時間
                            let end = time+(weeks-2)*7*24*3600000 + lastcnt*24*3600000 - 24*3600000; //第53周結束時間
                            // 爲日期對象 date 從新設置成時間 time 
                            date.setTime(start);
                            let _start = date.toLocaleDateString(); 
                            date.setTime(end);
                            let _end = date.toLocaleDateString(); 
                            return _start +'--'+ _end; 
                        }else{
                            let start = time+(weeks-2)*7*24*3600000; //第n周開始時間
                            let end = time+(weeks-1)*7*24*3600000 - 24*3600000; //第n周結束時間
                            // 爲日期對象 date 從新設置成時間 time 
                            return [new Date(start),new Date(end)]; 
                        }
            }else{//一年54周狀況
                        let cnt=0;// 獲取距離週末的天數
                        if(_week==0 && weeks==1){//第一週
                            cnt = 0;
                        }else if(_week==0){
                            cnt = 7;
                        }else if(_week==1){
                            cnt = 6;
                        }else if(_week==2){
                            cnt = 5;
                        }else if(_week==3){
                            cnt = 4;
                        }else if(_week==4){
                            cnt = 3;
                        }else if(_week==5){
                            cnt = 2;
                        }else if(_week==6){
                            cnt = 1;
                        }
                        cnt += 1;//加1表示以星期一爲一週的第一天
                        // 將這個長整形時間加上第N周的時間偏移
                        time += 24*3600000; //第2周開始時間
                        
                        let nextYear = new Date(parseInt(year,10)+1,0,1);
                        let nextWeek = nextYear.getDay();
                        let lastcnt = 0;//獲取最後一週開始時間到週末的天數
                        if(nextWeek==0){
                            lastcnt = 6;
                        }else if(nextWeek==1){
                            lastcnt = 0;
                        }else if(nextWeek==2){
                            lastcnt = 1;
                        }else if(nextWeek==3){
                            lastcnt = 2;
                        }else if(nextWeek==4){
                            lastcnt = 3;
                        }else if(nextWeek==5){
                            lastcnt = 4;
                        }else if(nextWeek==6){
                            lastcnt = 5;
                        }
                        
                        if(weeks==1){//第1周特殊處理
                            // 爲日期對象 date 從新設置成時間 time 
                            let start = date.toLocaleDateString(); 
                            date.setTime(time-24*3600000); 
                            return start +'--'+ date.toLocaleDateString(); 
                        }else if(weeks==54){//第54周特殊處理
                            let start = time+(weeks-2)*7*24*3600000; //第54周開始時間
                            let end = time+(weeks-2)*7*24*3600000 + lastcnt*24*3600000 - 24*3600000; //第53周結束時間
                            // 爲日期對象 date 從新設置成時間 time 
                            return [start,end]; 
                        }else{
                            let start = time+(weeks-2)*7*24*3600000; //第n周開始時間
                            let end = time+(weeks-1)*7*24*3600000 - 24*3600000; //第n周結束時間
                            // 爲日期對象 date 從新設置成時間 time 
                            return [start,end]; 
                        }
            }
            
}

 

只須要傳入 年份 週數 會返回 開始時間戳和結束時間戳 轉成你想要的日期格式便可 資源

相關文章
相關標籤/搜索