使用Moment.js的简单函数会产生意外(?)结果

时间:2014-04-10 14:34:16

标签: javascript momentjs

我写了两个简单的函数来玩Moment.js。

第一个函数返回一周作为日期数组,给定该周的任意一天。

var getWeek = function (day) {
    var today = day.clone();
    var monday = today.clone().startOf('isoWeek');
    var sunday = today.clone().endOf('isoWeek');
    var days = [];
    for (var current = monday.clone(); current.isBefore(today, 'day'); 
             current.add(1, 'days')) {
         days.push(current.format());
    }

    days.push(today.format());

    for (var current = today.clone().add(1, 'days');
         current.isBefore(sunday, 'day') || 
         (current.isSame(sunday, 'day') &&!today.isSame(sunday, 'day'));
       current.add(1, 'days')) {
       days.push(current.format());
    }

    return days;
};

第二个函数返回给定任意一天的一年中的星期数。

var dayofweek = function (day) {
    return Math.ceil(moment(day).dayOfYear() / 7);
};

然而,当我今天通过moment()测试时,我得到了正确的结果,15。 当我通过传递getWeek(moment())[0](星期一)测试它时,我得到14.

JSFiddle

我怀疑这与时区或类似事件有关,但我对这些事情的运作方式几乎一无所知。有人能搞清楚吗?

1 个答案:

答案 0 :(得分:1)

您计算周数的算法不正确。 (名称dayofweek也有点混乱)。

您需要使用

floor((dayOfYear(date) - dayOfWeek(date) + 10) / 7);

dayOfYear返回1-366,dayOfWeek返回1-7(周一至周日)。

但是,由于您已经在使用moment.js,为什么不使用.isoWeek()

Updated JSFiddle

来源:ISO Week Date (Wikipedia)