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
.
中存在错误
您需要使用 .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。
这应该是 return 一年的最后一周:
moment().year('2021').week(51).day('monday').format('YYYY-MM-DD');
而是 returning 2022-12-12
。我认为 moment.js
.
您需要使用 .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。