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上我提了一个issue和pr,因为是第一次提pr不太熟悉规则,小弟有什么犯错的地方欢迎大佬们指教。