2011-05-02 70 views
3

我有這個簡單的Javascript代碼DST問題存放日期

var d = new Date(2011, 9, 8); 
alert(d); // Show: Fri Oct 7 23:00:00 UTC-0400 2011 

重要提示:我的時區是 「智利聖地亞哥」,我設置計算機時鐘:2-OCT-2011 。

警報顯示Day是7 !!爲什麼?我如何才能做到這一點? (問題僅限於這一天)

+0

如果你使用'new Date(2011,9,7)',你真的確定它會顯示爲'Fri Oct 7 ...'嗎?否則,這將是一個時區問題。 – 2011-05-02 17:12:14

+0

100%肯定...設置時區爲「智利聖地亞哥」,看問題 – 2011-05-02 17:20:17

+0

啊!如果您在* 2011年10月8日之後將其設置爲日期*而且,你在什麼系統上測試這個? – 2011-05-02 17:23:12

回答

0

根據this page智利的DST變化總是在10月的第二個完整週末,並且從午夜開始(讓我們不考慮今年的擴展DST,因爲它很可能是您的電腦沒有這個功能)我知道它)。

這意味着,如使用腳本我linked to earlier也所示,在你的時區2011-10-9午夜不能在UTC-0300來表示,因此它自動切換到UTC-0400來表示同時。

我可以通過詢問2011年3月27日星期日凌晨2:00(當前時區CEST = UTC + 0200)在我的時區(阿姆斯特丹,UTC + 1/2h)中重現您的問題(此時夏季時間(CEST)開始,並且時鐘從UTC + 0100至UTC + 0200調整)(記住,這正是在北半球的對面))

new Date(2011, 2, 27, 2, 0, 0, 0); 

其有效地不能表示UTC + 0200,所以系統選擇UTC + 0100和輸出

Sun Mar 27 2011 01:00:00 GMT+0100 (CET)

因此,這是Unix time的同一時間,只在您當地的時區表示不同。

是的,我知道10月8日是星期六,夏令時的變化是在星期天,午夜開始,但這是我能得到的最接近的。


更新:我現在可以用WinXP的機器的時區設置爲聖地亞哥重現您的問題和讓操作系統自動調整爲DST 提醒new Date(2011, 9, 9)(這是一個週日,顯示作爲一個星期六;你的設置肯定有些奇怪)。當然,您無法控制客戶端上的這些設置。

要解決這個問題,我必須知道你到底需要:如果你只是想一些日期/時間顯示,這並不需要的時區和夏令時考慮在內,只要使用UTC,如:

var d = new Date(Date.UTC(2011, 9, 9)); 
alert(d.toUTCString()); // Shows: Sun, 9 Oct 2011 00:00:00 UTC 

要顯示/計算Date對象的各個部分,請使用相應的UTC methods

+0

感謝您的解釋。現在我知道這個問題,我知道爲什麼,但我不知道解決方案:( – 2011-05-02 18:40:37

+0

Thanks Marcel ...我認爲你的解決方案非常好,我可以像使用模式一樣使用它。 – 2011-05-04 06:38:50