2011-01-28 46 views
0

我被給了TzID(Olson tzid格式Exp:「歐洲/哥本哈根」)。之後,我試圖通過使用c#TimeZonInfo類來從該時區(與服務器本地時區不同)時間轉換某個DateTime。如何使用FindSystemTimeZoneById獲取元時區的時區?

我想知道爲什麼窗口的時區ID只,而時區ID爲奧爾森 TZ數據庫約100具有約405 TZ ID。讓我們說時區「歐洲/哥本哈根」,我不知道如何使用FindSystemTimeZonebyID獲取此時區的時區信息(它在Olson ID to windows ID convertion table的元區中列出)。任何有經驗的人?請幫幫我。

回答

1

From MSDN

FindSystemTimeZoneById嘗試匹配ID註冊表的分支HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones下Windows XP和Windows Vista中的子項的名稱。該分支不一定包含全面的時區標識符列表。

根據你鏈接到的表,你想傳遞字符串Europe_Central,因爲它是奧爾森「歐洲/哥本哈根」的Windows版本。 (請注意,根據MSDN文檔,它不區分大小寫。)如果不起作用,您應該檢查您的註冊表以確保存在Europe_Central條目。

有關Olson tz數據庫及其如何定義時區的更多信息,請參閱wikipedia


更新1:

我的註冊表(Vista)的有它列爲Central Europe Standard Time,這是我需要在以作爲參數傳遞的字符串,你有一個類似的項目嗎?

如果該條目不在您的註冊表中,您可以使用here的信息create it yourself,儘管看起來您需要爲夏令時制定規則(請參閱鏈接)。

您也可以嘗試使用DateTimeOffset,並使用DateTime來保存本地服務器時間並傳遞一個TimeSpan的+1小時(CET)。

根據您要做的事情,您也可以從CET時間減去一小時以獲得UTC。 (雖然一旦Central Europe Summer Time生效,這將不起作用;那麼你需要減去兩個小時。)

+0

非常感謝您的回覆。我使用路徑'HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones'檢查了註冊表,發現即使在時區註冊表更新之後,'Europe_Central'的時區註冊表也不存在(從http://下載support.microsoft.com/kb/979306)。我可否知道如何在時區註冊表中添加那些不在那裏的人?如果手動添加註冊表,它似乎太多了。謝謝。 – darrell 2011-01-28 10:12:10