Moment JS设置2021年第34周周一返回日期错误原因排查
问题原因
- 核心是Moment JS的
week()方法是本地化周计算规则,和你预期的ISO 8601标准周规则不一致:- 本地化
week()默认遵循当前运行环境的地区规则,多数地区默认规则为「周从周日开始,每年1月1日所在周为第1周」 - 你预期的2021年第34周对应
23 Aug 2021是ISO 8601标准周的计算结果,ISO规则为「周从周一开始,每年包含第一个周四的周为第1周,即该周至少有4天属于当前年份」
- 本地化
- 2021年出现偏差的原因:2021年1月1日为周五,按本地化规则第1周是2020年12月27日-2021年1月2日;按ISO规则第1周是2021年1月4日-1月10日,两者天然差1周,到第34周时偏差就体现了出来。
- 2019、2020年无偏差的原因:这两年的跨年周刚好满足本地化周和ISO周的计数重合,没有出现周数偏移,所以结果符合预期。
解决方案
把代码中的week()方法替换为符合ISO 8601标准的isoWeek()方法即可,修改后代码如下:
let time = moment(); console.log( time .year(2021) .isoWeek(34) .day('monday') .format('D MMM YYYY'), ); // 输出结果为 23 Aug 2021,符合预期
如果需要保证所有环境计算结果一致,也可以手动固定Moment的全局地区配置,统一周计算规则。
内容的提问来源于stack exchange,提问作者Cecily Miller
相关产品推荐
相关产品推荐

