2013-12-17 29 views
1

我在我的代碼中使用TimeZoneInfo.FindSystemTimeZoneById()TimeZoneInfo ID是依賴於機器?

而且我知道這個方法適用於ids在系統註冊表。

所以我想知道是否有任何機會,當它去服務器時,它不會正常工作,因爲服務器的註冊表上的ID與本地的不一樣。

有人知道嗎?

+0

爲什麼你需要時區ID?它們非常「不穩定」 - 例如,某些機器可能沒有正確的時區更新,爲客戶機和服務器上的同一時區顯示不同的時間。你能使用UTC嗎? – DarkWanderer

+0

@DarkWanderer因爲我將有不同時區的服務器和客戶端,比如澳大利亞和中國。時間應該顯示爲客戶端時間而不是服務器時間。而且還會有一天持續不斷的節省時間,所以對於所有這些,TimeZoneInfo可以讓我變得簡單。 – user3110409

回答

2

雖然可能該ID不會被發現(見其他答案),如果兩臺機器當前的Windows更新,那麼它是不是可能你將有一個不匹配。即使如此,儘管夏令時和顯示名稱的定義每年都會發生多次變化,但很少會創建全新的時區,並且ID一旦建立就永遠不會改變。

因此,只要至少您的服務器具有當前的Windows時區更新時區,那麼即使它們不是最新的,您也應該能夠處理來自客戶端的任何有效輸入。您可以在this site上查看Windows的所有時區更新。

但是,儘管如此,我最好的建議是放棄使用Microsoft時區並使用標準IANA時區。詳細信息請參見the timezone tag wiki。在.NET中,最好的方法是使用​​庫。

+0

感謝您的建議。這消除了我的擔憂。如果它沒有很大的失敗機會,我仍然可以使用Microsoft TimeZone。不過,我會檢查野田時間庫。 – user3110409

1

TimeZone的東西總是讓我困惑,但我的答案是YES 。有可能無法在不同的服務器上運行。

TimeZoneInfo.FindSystemTimeZoneById()方法使用HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones註冊表信息。有時微軟會發布一些Windows更新來改變這些信息。

例如August 2012 cumulative time zone update for Windows operating systems;

  • E.歐洲標準時間:此時區的顯示名稱已更新爲 「(UTC + 2:00)E.歐洲。」從「(UTC + 2:00)尼科西亞。」
  • 亞速爾羣島標準時間:將2013年DST開始時間更改爲在3月的最後一個星期日的凌晨12:00:00發生,結束時間爲10月最後一個星期日的 01:00:00 AM。
  • Pacific SA標準時間:如之前在Microsoft知識庫文章2681116中所公佈的,智利已將2012年日光 節省時間延長。智利政府已將2012年DST開始 的日期更改爲9月23日的第一個星期六:59:59.999和結束 的日期發生在4月的最後一個星期六23:59:59.999。

正如你所看到的,你的一臺服務器沒有在他們的註冊表中的相同信息(一個無法例如更新),這些TimeZone信息看起來不同。

+1

感謝您的建議。這對我有幫助。 – user3110409

0

由於您只需要將服務器日期時間轉換爲本地客戶端時間(而不是跨客戶端轉換),請在通信中使用UTC時間,並在客戶端使用DateTime.ToLocal()。那麼你根本不需要擔心註冊表或時區。

+0

但我需要考慮不斷變化的夏令時。 – user3110409

+0

再想一想 - 你認爲電腦的本地時間不會考慮到dst嗎? – DarkWanderer

+1

對不起,我不明白。客戶端是Web瀏覽器,所以它不能對DateTime.ToLocal()做任何事情。並且服務器與客戶端在不同的時區處於靜止狀態。 – user3110409