Moment.js 周数的日期不正确

Moment.js incorrect date for week number

这应该是 return 一年的最后一周:

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

而是 returning 2022-12-12。我认为 moment.js.

中存在错误

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

您需要使用 .isoWeek 而不是 .week(已记录 here,但我不清楚原因)。

您应该 post 您的代码在这里,而不是其他地方。

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')

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

  .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