当前位置: 首页 > Web前端 > HTML5

记得使用momentjs获取一年中所有周的开始时间,我遇到的bug

时间:2023-04-05 22:14:59 HTML5

前言业务有需求。选择某年之后,需要生成一个下拉列表,让用户可以选择一年中的每个星期,然后前端生成本周的起止时间(周一早上00:00:00到周日晚上00:00:00),发送到后台接口获取所选周的数据。在运行项目中,为了方便开发,引用了momentjs。下面是一开始就做的,所以业务的结果是有问题的://计算一年有多少周,返回每个周的起止时间exportconstmapWeeksOfyear=({year,week}={})=>{constnowYear=年份?年:时刻()。年();//设置正在处理的年份lethandleYear=moment(newDate(String(nowYear)));//今年有多少周consttotalWeeks=handleYear.endOf('year').isoWeek();constarr=[];for(leti=1;i<=totalWeeks;i++){arr.push({value:i,name:'th'+i+'week',startTime:handleYear.week(i).startOf('周'.valueOf(),//本周开始时间endTime:handleYear.week(i).endOf('week').valueOf(),//本周结束时间})}returnarr}对于上面结果,我测试了前几周的值,没有任何问题,但是后来发现后面的周数里,开始和结束时间不匹配的很厉害,总是多了一年。看了半天momentjs的API也没找到原因,决定自己写一个方法。其实这并不难。当然也不排除我对上述方法中momentjsAPI的理解有误。用原生js重写/***计算一年有多少个星期,返回每个时间的起止时间**/constmapWeeksOfyear=({year,week}={})=>{consthandleYear=年?year:newDate().getFullYear()//一年的开始和结束constyearBegin=newDate(`${handleYear}/01/0100:00:00`)constyearEnd=newDate(`${handleYear}/12/3100:00:00`)constaDay=24*60*60*1000constaWeek=aDay*7constbeginTime=handleDay(yearBegin,aDay)constarr=getWeek(beginTime,yearEnd.getTime(),aWeek)returnarr}functiongetWeek(beginTime,endTime,aWeek){constarr=[]for(leti=beginTime;i<=endTime;i+=aWeek){让时间=newDate(i)arr.push({startTime:i,endTime:i+aWeek,s:`${time.getFullYear()}${time.getMonth()+1}${time.getDate()}week${time.getDay()+1}`})}arr.forEach((item,i)=>{letindex=i+1item.value=indexitem.name=''+index+'week'})console.log(arr)返回arr}/***当然是一年中的第一个星期一天不一定是1月1日,可能包括上年12月的最后几天*默认第一周可能包括上年12月的最后几天*/functionhandleDay(yearBegin,aDay){lettime,day=yearBegin.getDay()switch(day){case0:time=0;休息;情况1:时间=1*一天;休息;情况2:时间=2*一天;休息;情况3:时间=3*一天;休息;案例4:时间=4*一天;休息;情况5:时间=5*一天;休息;情况6:时间=6*一天;yearBegin.getTime()-time}至此,上面已经获取了一年中的所有周,包括当前周的开始和结束时间执行结果