2009-06-05 117 views
0

我正在研究需要每天運行24H的應用程序,並且正在努力正確實施對DST的支持。所有時間都以UTC格式保存,但當我嘗試在當地時間顯示時遇到問題。現在我使用savedDate.ToLocalTime()從DB值轉換爲本地時間進行顯示。這似乎工作正常,除了當我更改時區信息以嘗試測試DST時。如果我在客戶端PC上修改時區,則顯示不會隨新時區更新。有沒有更好的方法來測試DST,還是我的轉換爲本地時間對於這種情況不正確?在24H應用程序中處理DST

+0

我想我可能會在下面的答案中產生混淆。這是精簡版框架,還是不是?雖然我們在這裏,你使用的是什麼版本的.NET Framework? – lance 2009-06-05 19:44:09

+0

我使用的是.NET 2.0,而不是Compact Framework。 – 2009-06-05 19:47:38

回答

1

我記得讀,或許對於Compact Framework的,有關.NET不是最可靠的,當談到關於DST報告。更可靠的是獲取當地時間和UTC的當前時間,然後確定(並在將來的調整中使用)自己的差異。如果沒有必要,這似乎是一條可怕的路線。我會看看如果我能找到一個參考備份我記得我認爲

你在做什麼,確切地說,是改變工作站上的時區?

+0

我正在更改我的系統時鐘從東部時間到大西洋時間的時區。這是爲了通過保持我的本地盒子的UTC時間相同來測試DST,但它具有當地時間變化。 – 2009-06-05 19:50:59

1

嗯。你預計實際上必須改變時區,而應用程序正在運行?如果框架在第一次獲取後緩存它,我不會感到驚訝。

我會在設備上設置時區,改爲「只是更改爲DST之前」,運行應用程序並檢查它正確地報告倍的時間。然後將時間更改爲「剛剛更換DST之前」。

記住,根據您的設備和時區數據庫的年齡,它可能不知道,幾年前在美國改變DST。 (啊,時區,得愛他們)

1

如果您從數據庫中檢索DateTime值,您通常會得到一個Date屬性設置爲DateTimeKind.Unspecified的DateTime。基本上,因爲我知道的任何特定於數據庫的DateTime類型(例如SqlDateTime)都不包含時區信息。

如果然後嘗試這個本地時間使用savedDate.ToLocalTime()「轉換」,你會得到過去存儲,無需任何轉換相同的日期時間值。

你需要做的是表明,所保存的日期是UTC執行轉換之前,是這樣的:

DateTime savedDateTime = (DateTime) reader["SomeDateTimeColumn"]; 

// Convert from unspecified to UTC 
DateTime utcDateTime = savedDateTime.SpecifyKind(savedDateTime, DateTimeKind.Utc); 
... 
// Convert from UTC to local 
DateTime localDateTime = utcDateTime.ToLocalTime(); 
0

我發現一些的.Net CF 2.0版本不正確地之間做翻譯時間UTC和當地時間。這些問題圍繞着幾年前發生在美國時區的變化。

的症狀是DST似乎不被視爲生效,直到四月(舊規則),而不是三月(新規則)。據推測,DST變更的後端(10月/ 11月)也存在問題。

到目前爲止,我還沒有找到有關可能是翻譯正確工作所需的最小構建的信息。

注意這不是通過應用操作系統DST修復(其,很明顯,也應該被安裝)固定。據我所知,它完全是CF的內在特徵。我沒有嘗試過所有的組合,但要小心。

如果你想在CF準確的翻譯,你只有兩種選擇:

  1. 自己做轉換(非常複雜的,剛性的,且容易出錯)。

  2. 確保您在設備上有必要的.Net和OS補丁,以便翻譯準確。

你也許能夠找到一個適合你的類庫。一個很有前途的課程是World Clock/Code Project),但不幸的是它依賴於CF中不可用的註冊表信息。因此,它不能直接移植到CF上。

然後最後,任何自己的解決方案都需要提供時區信息(UTC偏移,DST開/關日期等)。並在任何時候都準確。

對不起,這個壞消息。