【问题标题】:Simple function with Moment.js gives unexpected (?) resultMoment.js 的简单函数给出了意想不到的(?)结果
【发布时间】:2014-05-24 08:14:07
【问题描述】:

我编写了两个简单的函数来使用 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

我怀疑这与时区或类似的东西有关,但我对这些事情的工作原理几乎一无所知。有人能弄清楚吗?

【问题讨论】:

    标签: javascript momentjs


    【解决方案1】:

    您计算周数的算法不正确。 (还有dayofweek这个名字有点混乱)。

    你需要使用

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

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

    但是,既然您已经在使用 moment.js,为什么不直接使用 .isoWeek()

    Updated JSFiddle.

    来源:ISO Week Date (Wikipedia)

    【讨论】:

    • 我刚刚发现我可以使用.isoWeekday(Number).isoWeek() 来获取一周中的日期。 Moment.js 是一个很棒的库,但是文档有点混乱。谢谢!
    猜你喜欢
    • 2014-06-22
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2017-01-05
    • 2021-10-14
    • 1970-01-01
    相关资源
    最近更新 更多