前兩天公司作項目遇到一個需求,當選擇某一天向後臺發請求時,應傳入開始時間和結束時間,這裏就要計算出當日所在周的一個範圍才能夠,因而我翻江倒海百度各類找,發現資源有點少,另外有些代碼有坑,算法
最後,各取所長,加上我修改了一下,算法總算能夠用了,在這裏分享給你們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]; } } }
只須要傳入 年份 週數 會返回 開始時間戳和結束時間戳 轉成你想要的日期格式便可 資源