2013-04-18 50 views
0

我的電腦是Windows 7 64位;我在美國東海岸(東部時間);右鍵單擊任務欄時鐘並選擇「調整日期/時間」 - 標記我的時區「(UTC-05:00)東部時間(美國&加拿大)」並且告訴「日期和時間」小程序夏令時結束於11月。 (對於那些後來出現的,這是在四月,我們做了「春季前進」,以達到夏令時。)Windows GetTimeZoneInformation時差與ISO網站或谷歌不匹配

調用Windows GetTimeZoneInformation或GetDynamicTimeZoneInformation APIs(後者僅適用於Vista或更高版本)返回300分鐘的「偏差」值,5小時。 (偏差值不是負數,因爲該值的文檔顯示「UTC =當地時間+偏差」。)

但是,如果我去ISO web site that claims to show me the time on my computer它顯示一個匹配時鐘但結束-0400的時間。 (我試圖複製/粘貼它,但很難,因爲它每秒都在變化。)在Google中輸入「當前時間utc」顯示的時間比這裏的時間提前4小時(不是5小時)。

讓我感到困惑 - 我有一個運行Windows Server 2008的EC2實例,其他人設置並說故意設置爲GMT,以便根據服務器時鐘記錄的時間不會產生1小時跳轉夏令時。

當我連接到該服務器時,它顯示了一個比我在這裏看到的時間提前5小時的時間。但它在控制面板中的日期/時間小程序(與Windows 7不同)顯示當前時區爲「格林尼治標準時間(格林尼治標準時間)(愛丁堡,里斯本,倫敦)」,但也有「時區」(GMT)協調世界時「 - UTC - 如果我將時區更改爲(我認爲正確的),偏移量爲4小時。

Windows 7上的「時區設置」對話框(通過點擊上面討論的「日期和時間」小程序中的「更改時區...」按鈕來達到)具有標記爲「(UTC)協調世界時「(從現在起4小時)和」(UTC)都柏林,愛丁堡,里斯本,倫敦「(從現在起5小時)。

除了認爲EC2實例的時區設置錯誤 - 它應該被設置爲UTC,而不是倫敦時間來完成上述目標 - 我不理解這一點。美國的Windows 7說我距離UTC有5個小時;其他一切(包括Windows 2008設置爲UTC時間)表示4個小時。

那麼例程應該怎麼做才能產生具有拖尾時區偏移量的ISO風格時間戳? Windows API告訴我它應該是-0500,但其他一切都應該是-0400。幫幫我!!

+1

偏移量取決於您何時測量它(無論DST是否處於活動狀態)。那是你的問題。 – SLaks

+0

因此,返回偏差值的API以及DST是否處於活動狀態(在API返回碼中)不會調整偏差以允許我單獨使用它?我必須同時使用偏見和「我們在DST嗎?」數據拿出正確的答案? –

+0

你使用什麼datetime API?應該有一個函數需要一個時間戳併爲其返回一個偏移量。請注意,某些時區的DST偏移不是一個小時。 – SLaks

回答

1

在東部夏令時期間,偏移量實際上是UTC-04:00。 Windows中時區的顯示名稱列表不會更改以反映此情況。它只是顯示標準偏移量,對於東部標準時間是UTC-05:00。

服務器應設置爲「(UTC)世界標準時間」,而不是標有「(UTC)Dublin,Edinburgh,Lisbon,London」的設置。 「協調世界時間」設置永久固定在UTC,另一個在英國夏令時期間的日間偏移量爲UTC + 01:00。同樣,標籤僅顯示標準偏移量,即UTC + 00:00,在顯示中縮短爲「(UTC)」。

唯一的編程問題,你問:

那麼應該常規做生產具有尾隨時區的ISO風格的時間戳偏移?

這很大程度上取決於您使用的語言。您提到用於獲取系統當前時區信息的Win32 API,但很少直接調用這些信息。你用C寫作嗎? C++? C#? VB? Java的?別的東西?請回答,我可以回答這個問題。