Dayjs跨年获取周获取错误

66 阅读2分钟

众所周知,前端可以通过Dayjs和Momentjs对时间进行格式化和计算等操作。最近恰逢26年跨年我在使用这两个库获取周的时候发现了下面的问题。

dayjs.locale('en')
moment.locale('en')

dayjs('2025-12-31').format('YYYY年w周') // 2025年1周
moment('2025-12-31').format('YYYY年w周') // 2025年1周

dayjs.locale('en-gb')
dayjs('2025-12-28').format('YYYY年w周') // 2025年1周
dayjs('2025-12-31').format('YYYY年w周') // 2025年1周

我发现25年最后这几天格式化出来周是25年第一周,那么问题来了正确获取到的年/周应该是多少呢?我去小查了一下资料,下面是我的一些总结。

下面的总结是我通过查询资料的出来的一些感受,具体应该获取为第几周还需要根据业务来确定。

时间计算周主要分为两种ISO 8601 标准北美通用习惯,且在计算时主要注意两个问题:年第一周怎么算/每周的起始日

ISO 8601 标准

  • 本年度第一个星期四所在的星期;
  • 1月4日所在的星期;
  • 本年度第一个至少有4天在 同一星期内的星期;
  • 星期一在去年12月29日至今年1月4日以内的星期;
  • 每周周一为起始日

北美通用习惯

  • 1月1日所在的周就是第一周
  • 每周周天为起始日

根据上面的规则,可以得到下面的答案

// ISO 8601
dayjs('2025-12-28').format('YYYY年w周') // 2025年52周
dayjs('2025-12-31').format('YYYY年w周') // 2026年1周
// 北美
dayjs('2025-12-28').format('YYYY年w周') // 2026年1周
dayjs('2025-12-31').format('YYYY年w周') // 2026年1周

我在dayjs的github上我提了一个issuepr,因为是第一次提pr不太熟悉规则,小弟有什么犯错的地方欢迎大佬们指教。