【问题标题】:momentjs is not calculating the week number correctlymomentjs 没有正确计算周数
【发布时间】:2020-04-13 17:45:13
【问题描述】:

我正在尝试根据我从后端收到的纪元时间计算周数。所以我从后端收到的值是1571097600000(15th October 2019)。现在,当我使用此代码将此纪元日期更改为一周的开始时

moment(1571097600000).startOf("week").unix()*1000

我得到的是这个1570906800000(13th October 2019)。但是当我格式化这个日期时,周数不正确。我就是这样格式化的

moment.(1570906800000).format("W, YYYY")

我得到的值是41,但实际上周数是42。知道这里发生了什么

这是我正在使用的代码

console.log(moment(1571097600000).startOf("week").unix()*1000)
console.log(moment(1571097600000).startOf("week").format("W, YYYY"))

【问题讨论】:

    标签: javascript datetime momentjs moment-timezone


    【解决方案1】:

    发生的情况是,您的系统设置是从周日开始的一周,但 ISO 周从周一开始。

    您的初始时间值是 2019 年 10 月 15 日星期二,但是当您执行 startOfWeek 时,日期会设置为 2019 年 10 月 13 日星期日,即上一个 ISO 周。 Moment.js 声称在一周开始时使用“区域设置感知”,但我不知道这有多强大。我建议始终使用 ISO 周。

    如果您想使用 ISO 周,请使用 startOf('isoWeek')

    let mLocal = moment(1571097600000);
    let mISO = mLocal.clone();
    let f = 'ddd DD MMM YYYY';
    console.log('Start date : ' + mLocal.format(f));
    
    // "locale aware" start of week
    mLocal.startOf("week");
    // ISO start of week
    mISO.startOf("isoWeek");
    
    
    console.log('Local start: ' + mLocal.format(f));
    console.log('ISO week   : ' + mLocal.format("W, YYYY"))
    console.log('ISO start  : ' + mISO.format(f));
    console.log('ISO week   : ' + mISO.format("W, YYYY"))
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

    【讨论】:

    • 感谢您的评论,这是一个更好的答案,所以我删除了我的。
    猜你喜欢
    • 1970-01-01
    • 2019-05-07
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多