算出当年的某一天是第几周并算出周的范围

前两天公司做项目遇到一个需求,当选择某一天向后台发请求时,应传入开始时间和结束时间,这里就要计算出当日所在周的一个范围才可以,于是我翻江倒海百度各种找,发现资源有点少,另外有些代码有坑,

最后,各取所长,加上我修改了一下,算法总算可以用了,在这里分享给大家

首先项目是 angular ,组件是 NG-ZORRO   https://ng.ant.design/docs/introduce/zh 参考

这个日期组件使用周类型的只会返回当日是所在年的第几周

整理后的算法

 

/**
         *    返回某年某月周次范围
         *    @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]; 
                        }
            }
            
}

 

只需要传入 年份 周数 会返回 开始时间戳和结束时间戳 转成你想要的日期格式即可 

 

posted @ 2019-04-25 15:40  刀神归来  阅读(391)  评论(0编辑  收藏  举报