2016-04-25 79 views
1

不同於docs for Moment.js,它根據ISO 8601Moment.js週數從MySQL

wikipedia page for ISO 8601moment().startOf('isoWeek')套在一週的第一天,它說的第一個星期是(其他等效定義中):第一週的大部分時間(四個或更多)在開始的一年。

docs for MySQL,它說WEEK(date, 3)給出了一週(1-53),週一爲第一週的第一天,今年有4天或更多天。

從我可以告訴,這些都是一個星期的所有等效定義,但他們沒有網格。

我的MySQL數據庫(v5.6.17)給了我201616SELECT YEARWEEK('2016-4-20',3)

在瀏覽器中使用Moment.js(v2.10.3)給了我Mon Apr 11 2016moment().year(2016).week(16).startOf("isoweek")

這些都不是在同一個星期,我無法弄清楚爲什麼。

+0

2016年4月11日確實是2016年第15周的ISO開始,而4月20日是16日(儘管週一18是該周的ISO開始)。我認爲你的語法是錯誤的:'時刻('2016-W16')'設定2016-04-18的日期,即星期一在第16周開始。 – RobG

回答

3

當您撥打.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星期編號和星期開始。

+0

您是不是應該設置'isoWeekYear'而不是'year'?例如,2016年初的ISO年可能是2015年。 – Brendon

+0

@ Brendon-我不知道爲什麼OP在設定年度,我只是指出了差異。設置* isoWeekYear *將當天設置爲當年同一周的同一天。在1月1日左右,它可以將日期改變大約12個月,例如2016年1月1日星期五是2015年ISO第53周,2016年ISO設置將其轉換爲星期五(2016年1月1日).iso(2016年1月1日).isoWeekYear(2016).format在2016年的第53周,即2016年12月30日。 – RobG

+0

我不知道OP的意圖是什麼,但他提到了MySQL的'YEARWEEK'功能,所以他可能有興趣設置週年而不是年。即使OP沒有使用ISO標準的週年和週數,他也需要使用#weekYear而非#moment的時間。 – Brendon