前两天公司作项目遇到一个需求,当选择某一天向后台发请求时,应传入开始时间和结束时间,这里就要计算出当日所在周的一个范围才能够,因而我翻江倒海百度各类找,发现资源有点少,另外有些代码有坑,算法
最后,各取所长,加上我修改了一下,算法总算能够用了,在这里分享给你们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]; } } }
只须要传入 年份 周数 会返回 开始时间戳和结束时间戳 转成你想要的日期格式便可 资源