moment.locale 导致年份错误

moment.locale is causing wrong year

从 2 年开始,我就一直在我的 nodejs 应用程序中使用 moment,它在昨天 2022-01-01 之前一直运行良好。 时刻开始给出错误的年份(在服务器生产和开发环境中)

这是我的代码

const moment = require('moment'); 
console.log(moment().locale('fr').year(2021).week(48).startOf('week').format());
// ouptut 2020-11-23T00:00:00+01:00
console.log(moment().year(2021).week(48).startOf('week').format());
// output 2021-11-21T00:00:00+01:00

这是我的开发环境:

nodejs v10.23.0
npm 6.14.8
package: "moment": "^2.29.1",

可以确认这看起来像一个错误。一些快速调查显示它看起来与语言环境如何改变一周的开始有关,将 2021 的“第一周”放在 2020 中然后倒带,我认为这个错误据报道 here.

基本上这意味着你不能相信这个机制会到达一个时间

解决方法

使用.add来自已知良好的值;例如

moment('2021-01-01').locale('fr').add(7 * 48, 'days').startOf('week').format();
// => '2021-11-29T00:00:00+00:00'

请注意,由于“一周的开始”不同,这仍然可能与其他地区的周行为有所不同,在世界大部分地区,一周从“星期一”开始,但在某些地方(例如美国)星期日是一周的第一天

moment('2021-01-01').add(7 * 48, 'days').startOf('week').format();
// => '2021-11-28T00:00:00+00:00' (USA-style default behaviour)

一致性

如果您根本不希望此行为随语言环境发生变化,而不是使用“一周的开始”,您需要专门选择一天,即 1 = Monday

const usa = moment('2021-01-01').add(7 * 48, 'days').day(1).format();
const fr = moment('2021-01-01').locale('fr').add(7 * 48, 'days').day(1).format();
usa === fr; // true, both 29th of November