普通视图

发现新文章,点击刷新页面。
今天 — 2026年1月13日首页

Dayjs跨年获取周获取错误

作者 爆浆麻花
2026年1月13日 18:11

众所周知,前端可以通过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年第一周,那么问题来了正确获取到的年/周应该是多少呢?我去小查了一下资料,下面是我的一些总结。

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

时间计算周主要分为两种<font style="color:rgb(10, 10, 10);">ISO 8601 标准</font><font style="color:rgb(10, 10, 10);">北美通用习惯</font>,且在计算时主要注意两个问题:<font style="color:rgb(10, 10, 10);">年第一周怎么算</font>/<font style="color:rgb(10, 10, 10);">每周的起始日</font>

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不太熟悉规则,小弟有什么犯错的地方欢迎大佬们指教。

❌
❌