记一次用momentjs获取一年内所有周的起始时间遇到的bug

7次阅读

共计 1639 个字符,预计需要花费 5 分钟才能阅读完成。

前言

业务有一个需求,选择了某一年后需要生成一个下拉列表让用户可以选择这一年各个周,然后前端产生这个周起始和结束的时间(周一早上 00:00:00 到周日晚上00:00:00),发送给后端接口获取所选周的数据。

操作

项目中为了开发上的方便,引用了momentjs

下面是一开始的做的,这样出业的结果是有问题的:

// 算出一年有多少个周,并返回每一同的开始和结束时间
export const mapWeeksOfyear = ({year, week} = {}) => {const nowYear = year ? year : moment().year();
  
        // 设置正在处理的年份
    let handleYear = moment(new Date(String(nowYear)));
      // 这一年有多少个周
    const totalWeeks = handleYear.endOf('year').isoWeek();
    const arr  = [];
    for(let i = 1;i <= totalWeeks;i++){
        arr.push({
            value: i,
            name: '第' + i + '周',
            startTime: handleYear.week(i).startOf('week').valueOf(),// 这周的开始时间
            endTime: handleYear.week(i).endOf('week').valueOf(), // 这周的结束时间})
    } 
    return arr
}

以上的结果我测试了前几周的数值都没有问题,但是后来发现后面的周数中,开始和结束时间严重不匹配,总是多出一年的时间。

在看了很久 momentjsAPI没有找到原因后我觉定自己写一个方法,其实这个也不难。当然也不排除上面的方法中我对 momentjsAPI理解不正确

 // 算出一年有多少个周,并返回每一同的开始和结束时间

export const mapWeeksOfyear = ({year,week,} = {}) => {const nowYear = year ? year : moment().year();

    let handleYear = moment('2020/01/01', 'YYYY/MM/DD');// 设置正在处理的年份
    const totalWeeks = handleYear.endOf('year').isoWeek();
    const arr  = getWeek(nowYear, totalWeeks) 
    return arr
}

function getWeek (year, num) {const arr = []
    const aDay = 24 * 60 * 60 * 1000
    const aWeek = aDay * 7
    // 一看的开始时间
    let startTime = new Date(year + '-01-01 00:00:00');
    const day = startTime.getDay()
        
    // 当然,一年中第一周的周一那天不一定是在这 1 月 1 日,可能包函上一年的 12 月最后几天
    startTime = startTime.getTime() -  handleDay(day, aDay)
  
    for(let i = 1; i <= num; i++) {
        arr.push({
            value: i,
            name: '第' + i + '周',
            startTime: startTime + (i - 1) * aWeek,
            endTime: startTime + i * aWeek,
        })
    }
    return arr
}
function handleDay (day, aDay) {
    let time
    switch(day){
        case 0:
            time = 0;
            break;
        case 1: 
            time = 1 * aDay;
            break;
        case 2: 
            time = 2 * aDay;
            break;
        case 3: 
            time = 3 * aDay;
            break;
        case 4: 
            time = 4 * aDay;
            break;
        case 5: 
            time = 5 * aDay;
            break;
        case 6: 
            time = 6 * aDay;
            break;
        default: 
            time = 0;
            break;
    }
    return time
}

至此,以上就获取了一年中所有的周,并包括了当前周的开始和结束时间

正文完
 0