Moment.js 周数不同于 MySQL

Moment.js week number differs from MySQL

docs for Moment.js 开始,它说 moment().startOf('isoWeek') 根据 ISO 8601 设置为一周的第一天。

wikipedia page for ISO 8601 开始,它说第一周是(在其他等效定义中):第一周的大部分(四天或更多)天数在起始年。

docs for MySQL开始,它说WEEK(date, 3)给出一个星期(1-53),以星期一为第一周的第一天,今年有4天或更多天。

据我所知,这些都是一周的等效定义,但它们并不相符。

我的 MySQL 数据库 (v5.6.17) 为 SELECT YEARWEEK('2016-4-20',3)

提供 201616

在浏览器中使用 Moment.js (v2.10.3) 为 moment().year(2016).week(16).startOf("isoweek")

提供 Mon Apr 11 2016

那些不是同一周,我不明白为什么。

当您调用 .week() 时,您正在设置 "locale" 周(我不知道 moment.js 是如何计算出来的),但第一天可能是星期日。当您随后调用 .startOf('isoweek') 时,您将获得该周的 ISO 开始,即前一个星期一。

要用ISO,就得用ISO方法,所以:

moment().year(2016).isoWeek(16).startOf('isoweek');

为 2016-04-18T00:00:00 创建时刻对象

或使用字符串:

moment('2016-W16') // 2016-04-18T00:00:00

默认为 ISO 周编号和一周的开始。