2016-12-22 112 views
2

爲什麼會出現這種情況 -JavaScript date.setMilliseconds奇怪的行爲?

var date = new Date('2015-10-24T23:31:04.181Z'); 
date.toISOString(); // "2015-10-24T23:31:04.181Z" 
date.setMilliseconds(date.getMilliseconds() + 1); 
date.toISOString(); // "2015-10-24T22:31:04.182Z" 
  • 小時移動一回(23 - > 22)
  • 正常工作與其他日期

它是一個時區問題?爲什麼所有日期值都不會發生?

謝謝

+0

Chrome&Node.js,我的時區是+2,試試這個:https://jsfiddle.net/eeqo9ke9/1/ – AvnerSo

+0

我在Chrome 54.0.2840.100(64位)/ Linux – AvnerSo

+1

在Windows上使用耶路撒冷作爲我的時區與Chrome進行復制。有趣的是,TZ偏移從-120增加到毫秒後從-120增加到了:https://jsfiddle.net/eeqo9ke9/2/ –

回答

2

這是夏令時,以非常明顯的方式。 :-)

2015-10-24T23:31:04.181Z在耶路撒冷是2015年10月25日01:31:04 GMT + 0200(耶路撒冷標準時間)DST結束並且時鐘返回的日期/時間( reference)。具體來說,它在Groundhog Hour內:當天有兩個01:31:04,第一個是夏季時間,第二個是標準時間後的一個小時。

您正在使用setMilliseconds,這是一個當地時間函數。正如你可能知道的那樣,JavaScript的Date在處理日期字段之間的翻轉(儘管在這種情況下沒有翻轉)是很明智的,所以setMilliseconds的邏輯必須處理以允許可能的翻轉。這是detailed in the specification,但基本上它採用當前時間值(自Epoch以來的毫秒數),將本地日期/時間排除在外,進行工作,然後必須將該本地日期/時間轉換回新的時間值。

但這裏是問題的起點:那兩天01:31:04s那一天。 V8必須在確定真實日期/時間時選擇一個。它選擇夏季時間,比您原來的日期/時間早一個小時。

如果您使用setUTCMilliseconds,這不會發生,因爲沒有往返當地時間。

道德故事:如果您使用UTC,則只能使用UTC。 :-)