2008-11-19 78 views

回答

3

我不知道有關ASP的最新演變,但這article from 2006提供了一個有趣的答案:

的問題是,時區信息不直接可通過Web瀏覽器。您可以使用啓發式方法確定正確的時區,或者您必須根據用戶的選擇爲用戶存儲時區設置。

接下來可能無法與.net 3.5及其TimeZoneInfo..ConvertTime方法需要,不過,出於完整性的緣故:

一旦你有,你現在需要的時間翻譯時區設置。 您應該始終使用UTC將日期/時間值存儲在數據庫中。這消除了許多轉換問題。如果以UTC格式存儲信息,那麼只需將UTC顯示到用戶的本地時區,然後將數據顯示給它們時,如果從中獲取日期/時間值,則需要將時區轉換爲UTC。

是什麼使這更困難的是,TimeZone類是不是所有的有用。幸運的是,在v2.0中,DateTime更新爲支持時間是否爲UTC的指標。 您可以使用DateTime.ToUniversalTime方法將DateTime轉換爲UTC。不幸的是,您不能將其轉換回

ToLocalTime方法使用,在服務器上運行,使用服務器的時區,這是不是你想要的本地時區。但更糟糕的是,您不能簡單地創建TimeZone對象並使用它,因爲該支持不存在。

邁克爾·布拉姆爲了能夠輕鬆地創建和使用時區創造了一個很好的little class。我個人在我自己的應用程序中使用了該代碼的重大修改版本,並且效果很好。以下是將DB UTC值轉換爲本地用戶時區的步驟。

1)獲取用戶
2)創建的SimpleTimeZone類來包裝它(使用一個DB值映射到底層的Windows註冊表版本的一些映射方案)
3的存儲區值)使用SimpleTimeZone.ToLocalTime方法將DateTime值轉換爲本地時間。

出於性能方面的考慮,您或許應該得到和初始化的SimpleTimeZone實例,並將它緩存在項目屬性爲請求的長度,這樣你就不必不斷創建它。

從用戶的本地時區轉換爲UTC做相反:

1)從用戶
2獲取存儲區值)創建的SimpleTimeZone類來包裝它
3)使用的SimpleTimeZone .ToUniversalTime方法將DateTime轉換爲UTC。

+0

感謝您的意見 - 我不希望顯示爲「用戶時間」,只是從服務器的不同時間(靜態)。無論如何,這仍然回答我的問題 – 2008-11-19 06:50:30

1

請允許我回答這個問題直接

有沒有一種方法來定義時區在ASP.NET應用程序使得從讀/相比,目前的服務器時間隱式轉換始終...

不,這不是可能。 .NET中沒有任何機制可以在每個線程或每個應用程序的基礎上更改本地時區。它只能通過運行代碼的機器的時區設置在系統範圍內進行更改。 See this answer also

...或者我是否需要在每個DateTime.Now調用中輸入轉換語句?

您不應該在網絡應用程序中使用DateTime.Now。由於服務器的時區設置可以很容易地更改,因此您應該設計應用程序以忽略它。這意味着在讀取當前系統時間時使用DateTime.UtcNow。或者,您可以使用DateTimeOffset及其DateTimeOffset.NowDateTimeOffset.UtcNow屬性。

參見:The Case Against DateTime.Now

當你需要與特定用戶的本地時間來工作,然後是 - 你必須投入轉化爲每個使用。您可以使用TimeZoneInfo類完成此操作。

您也可以考慮使用Noda Time,它提供了IANA time zone database的實現,並且通常是一個更好的API。

相關問題