You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:45:04