2012-02-24 82 views
1

這次往返失敗,我懷疑由於中間時間不明確。對此有什麼可以做的嗎?它不結果相符:.NET往返時區轉換不匹配(IsAmbiguousTime問題?)

http://www.timeanddate.com/worldclock/converted.html?month=11&day=6&year=2011&hour=1&min=59&sec=0&p1=179&p2=75

是,僅僅巧合的是,.NET挑選一個可能的模棱兩可的時間,該網站選擇了其他,那是一個我希望回來?

我認識到解決方案是以UTC存儲時間,但我正在處理遺留應用程序。

public const string EASTERN_TIMEZONEID = "Eastern Standard Time"; 
public const string MOUNTAIN_TIMEZONEID = "Mountain Standard Time"; 

[TestMethod] 
public void MountainToEasternToMountain_DaylightSavings_Test() 
{ 
    DateTime originalTime = new DateTime(2011, 11, 5, 23, 59, 0); // November 5, 2011 - 11:59pm 
    DateTime expectedMiddle = new DateTime(2011, 11, 6, 1, 59, 0); // November 6, 2011 - 1:59am 
    DateTime expectedEnd = originalTime;       // November 5, 2011 - 11:59pm 

    TimeZoneInfo easternTimeZone = TimeZoneInfo.FindSystemTimeZoneById(EASTERN_TIMEZONEID); 
    TimeZoneInfo mountainTimeZone = TimeZoneInfo.FindSystemTimeZoneById(MOUNTAIN_TIMEZONEID); 

    var middleTime = TimeZoneInfo.ConvertTime(originalTime, mountainTimeZone, easternTimeZone); 

    var isSourceAmbiguous = mountainTimeZone.IsAmbiguousTime(originalTime); 
    var isMiddleAmbiguous = easternTimeZone.IsAmbiguousTime(middleTime); 

    Assert.AreEqual(expectedMiddle, middleTime); 

    var destTime = TimeZoneInfo.ConvertTime(middleTime, easternTimeZone, mountainTimeZone); 

    var isMiddleSourceAmbiguous = easternTimeZone.IsAmbiguousTime(middleTime); 
    var isDestAmbiguous = mountainTimeZone.IsAmbiguousTime(destTime); 

    Assert.AreEqual(expectedEnd, destTime); 
}  
+0

爲了不被輕率,但關閉DST變化時Web服務器將是一個很好的解決方法。這種含糊不清的治療方法並沒有什麼神奇的療效。 – 2012-02-24 13:28:13

回答

1

該往返旅行失敗,我懷疑是由於產生的中間時間是不明確的。對此有什麼可以做的嗎?

不是,如果你想保留東西DateTime代表當地時間,沒有。從根本上說,你失去了數據:有兩個輸入值映射到相同的輸出值,這顯然禁止了圓形跳閘。

我假設,作爲一個傳統的應用程序使用,禁止代替Noda Time太多的可能性,這使得這一切要更理智的處理有點...

這不是更清晰的大局觀是什麼,但你不能從一個事實,即從本地時間轉換脫身(無偏移)在一個時區至其他本地時間或通用時間基本上有三種可能的結果:

  • 2結果:當地時間發生兩次
  • 1結果:th è本地時間明確
  • 0的結果:當地時間跳過
+0

好吧,聽起來像我們被卡住了。往返正在經歷數據庫DateTime,其中包含大量遺留數據和SP,因此將其更改爲UTC或時區知識將很昂貴。感謝您的確認。 – ss2k 2012-02-29 19:49:19