2013-03-28 28 views
5

我知道我們可以改變當前線索的當前文化。 我知道我們不能從CurrentCulture,因爲一個文化得到TimeZoneInfo可能有許多時區如美國如何設置每個線程的時區?

但用同樣的方法來對付時區當前線程的

這將是非常好的,如果我們能做出這樣的事:

TimeZone.CurrentTimeZone = TimeZoneInfo.FindSystemTimeZoneById("timezone id"); 
+1

我們不是.NET網站所需的功能,我們堅實的問題網站的答案。時區處理在最好的時候並不是微不足道的,每個線程添加一個時區的複雜性層只是要求麻煩 – Petesh

+0

@Petesh我不是故意問爲什麼實際。我想知道這是否可能以某種方式。 –

+1

沒有什麼能阻止你爲時區創建一個線程本地對象,它只不過是你的代碼將無法使用它。你應該看看.NET中的['ThreadLocal 'Class](http://msdn.microsoft.com/en-us/library/dd642243.aspx)是一種實現它的簡單方法。 – Petesh

回答

5

不幸的是,「當前」時間區的任何概念是依賴於機器的操作系統設置,代碼正在運行。有一些Win32 API用於更改時區,但我不建議使用它們。它們不僅不是「線程安全」的,而且它們也不是「流程安全的」。時區設置會影響機器上運行的所有內容。

這就是說,我會好奇你的用例是什麼。如果您能夠設置每個線程的時區,那麼您可能完全不依賴本地設置。您可以改爲使用TimeZoneInfo上的轉換方法。

例如,假設您正在尋找其他時區的當前時間。你可能會尋找到這樣做的能力:

using (TimeZone.CurrentTimeZone = ... ) 
{ 
    var now = DateTime.Now; 
} 

但是相反,你應該簡單地從UTC在適當轉換:

var now = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
         DateTime.UtcNow, "some other timezone id"); 
+0

時區隱含地用於許多不同的功能(例如,使用'AdjustToUniversal'從字符串到日期時間的轉換)。他們肯定可以手動更改爲使用明確的時區,但在大型代碼庫中並不容易。以同樣的方式,你可以明確地指定在'string.Format()'這樣的函數中使用的區域性,但是你可以選擇爲線程設置區域性,並且一次性修復它們。 – MiMo

+2

是的,它在很多功能的內部使用,但沒有 - 你不能改變它。沒有鉤子,一切都被封住了。人們會認爲它會像cultureinfo一樣行事,但事實並非如此。它完全不同。只有一個系統範圍的時區設置。 –

+0

是的,我知道 - 我以前的評論是針對您的問題「什麼是(會是)這種事情的用例」(如果存在的話)的嘗試答案。 – MiMo