【问题标题】:Moment.js incorrect date for week numberMoment.js 星期数的日期不正确
【发布时间】:2022-01-25 23:21:47
【问题描述】:

这应该返回一年中的最后一周:

moment().year('2021').week(51).day('monday').format('YYYY-MM-DD');

但它返回的是2022-12-12。我认为moment.js 中存在错误。

这里是代码笔:https://jsfiddle.net/5402bkmp/

【问题讨论】:

  • 在 ISO 周中,第 51 周是 2021 年 12 月 20 日星期一到 12 月 26 日星期日。最后一个 ISO 周是第 52 周,从 2021 年 12 月 27 日星期一到 2022 年 1 月 2 日星期日。

标签: javascript node.js datetime momentjs


【解决方案1】:

您需要使用.isoWeek 而不是.week(记录在here,尽管我不清楚为什么)。

【讨论】:

  • 完全不清楚,因为 ISO 第 51 周不是 2021 年的最后一周,它从 12 月 20 日而不是 12 月 12 日开始。最后一周是 52 周,从 12 月 27 日开始。
  • @RobG 是的,我知道,缺少文档,遗憾的是我没有时间深入研究源代码以找出区别所在。链接到的维基百科文章也没有帮助我。
【解决方案2】:

您应该在此处发布您的代码,而不是其他地方。

var now = moment().year('2021').week(51).day('monday').format('YYYY-MM-DD');
console.log(now.toString());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

分解代码,如果在 12 月 27 日星期一运行:

moment()

为 2021 年 12 月 27 日创建一个时刻对象

  .year('2021')

将年份设置为 2021 年,这没有任何改变,因为它已经设置为 2021 年。它还处理像 2020-02-29 + 1 年这样的情况,即变为 2021-02-28。

  .week(51)

在第 51 周开始时设置为“本地化”。问题是,用户如何知道 moment.js 是如何本地化的?对我来说,它似乎是 2021 年 12 月 12 日星期日。该编号似乎是基于从 2021 年 1 月 1 日或之前的第一个星期日开始的第一周(即 2020 年 12 月 27 日星期日),例如new Date(2020, 11, 27 + 50*7) 2021 年 12 月 12 日。

  .day('monday')

将日期设置为同一个本地化周的星期一,用户也很难知道他们的“本地化”周是什么。对我来说,它只是保持为星期一,因为本地化的一周似乎从星期日开始(我的电脑设置为星期一开始几周)。

  .format('YYYY-MM-DD')

所以我认为很明显,使用 week 方法的一个问题是程序员和用户都不知道结果会是什么,因为他们不知道 moment.js 使用什么来进行本地化东西(可能是 navigator.language)。结果可能与预期大相径庭。

正如 Sergiu 建议的那样,一种解决方法是使用 isoWeek,因此至少结果是一致且可预测的。 ISO 周从星期一开始,第一周是本年度中天数最多的一周。它也表示为第一个星期四的那一周,或 1 月 4 日的那一周,它们都致力于将同一星期一作为任何特定年份的第 1 周的开始。有的年份有 52 周,有的有 53 周,而且通常接近年底的几天是下一年的第一周或上一年的最后一周。

您可能还想查看Get week of year in JavaScript like in PHP

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多