2011-02-10 70 views
2

我處於服務器發送CEST時間的情況,除了DST開關之外,我需要將它顯示在UI上,因爲它是從服務器接收的。GMT中的模糊小時應轉換爲明確的格林尼治標準時間。可能在下面測試可以解釋我的意圖。TimeZone.IsAmbiguousTime,爲什麼GMT格式的模糊時間會失敗?

[Test] 
public void Should_process_server_time() 
{ 
    var britishZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
    var germanZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"); 
    var firstAmbigiousMarchEntry = new DateTime(2011, 03, 27, 01, 00, 00); 
    var secondAmbigiousMarchEntry = new DateTime(2011, 03, 27, 01, 30, 00); 

    //Why does this fail even though 2011-03-27 01:00:00 is an ambigous time in GMT? 
    Assert.That(britishZone.IsAmbiguousTime(firstAmbigiousMarchEntry)); 
    Assert.That(britishZone.IsAmbiguousTime(secondAmbigiousMarchEntry)); 

    var unAmbigiousFirstMarchEntry = TimeZoneInfo.ConvertTime(firstAmbigiousMarchEntry, germanZone, britishZone); 
    var unAmbigiousSecondMarchEntry = TimeZoneInfo.ConvertTime(secondAmbigiousMarchEntry, germanZone, britishZone); 

    Assert.That(britishZone.IsAmbiguousTime(unAmbigiousFirstMarchEntry), Is.False); 
    Assert.That(britishZone.IsAmbiguousTime(unAmbigiousSecondMarchEntry), Is.False); 

    Assert.That(unAmbigiousFirstMarchEntry.Hour == 2); 
    Assert.That(unAmbigiousFirstMarchEntry.Minute == 0); 
    Assert.That(unAmbigiousFirstMarchEntry.Second == 0); 

    Assert.That(unAmbigiousSecondMarchEntry.Hour == 2); 
    Assert.That(unAmbigiousSecondMarchEntry.Minute == 30); 
    Assert.That(unAmbigiousSecondMarchEntry.Second == 0); 

} 

請你能幫忙嗎?我的目的是將英國區域的模糊時間轉換爲英國區域的明確時間,即2011-03-27 01:00:00至2011-03-27 02:00:00。爲此,我需要確定DateTime收到的格林尼治標準時區不明確,但呼叫失敗。 我的系統正在運行英國區域設置。

我嘗試了下面的測試,並且它通過了。現在我很困惑,因爲當涉及GMT區域時,IsInvalidTimeIsAmbigoustime之間的區別是什麼?

[Test] 
public void Should_process_server_time() 
{ 
    var britishZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
    var germanZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time"); 
    var firstAmbigiousMarchEntry = new DateTime(2011, 03, 27, 01, 00, 00); 
    var secondAmbigiousMarchEntry = new DateTime(2011, 03, 27, 01, 30, 00); 

    Assert.That(britishZone.IsInvalidTime(firstAmbigiousMarchEntry)); 
    Assert.That(britishZone.IsInvalidTime(secondAmbigiousMarchEntry)); 

    var unAmbigiousFirstMarchEntry = TimeZoneInfo.ConvertTime(firstAmbigiousMarchEntry, germanZone, britishZone); 
    var unAmbigiousSecondMarchEntry = TimeZoneInfo.ConvertTime(secondAmbigiousMarchEntry, germanZone, britishZone); 

    unAmbigiousFirstMarchEntry = unAmbigiousFirstMarchEntry.AddHours(2); 
    unAmbigiousSecondMarchEntry = unAmbigiousSecondMarchEntry.AddHours(2); 

    Assert.That(britishZone.IsAmbiguousTime(unAmbigiousFirstMarchEntry), Is.False); 
    Assert.That(britishZone.IsAmbiguousTime(unAmbigiousSecondMarchEntry), Is.False); 

    Assert.That(unAmbigiousFirstMarchEntry.Hour == 2); 
    Assert.That(unAmbigiousFirstMarchEntry.Minute == 0); 
    Assert.That(unAmbigiousFirstMarchEntry.Second == 0); 

    Assert.That(unAmbigiousSecondMarchEntry.Hour == 2); 
    Assert.That(unAmbigiousSecondMarchEntry.Minute == 30); 
    Assert.That(unAmbigiousSecondMarchEntry.Second == 0); 
} 

而且你覺得這可以實現更好嗎?

回答

5

我認爲答案是格林威治標準時間從不含糊。 GMT總是+0。倫敦時區稱西歐時間,冬季爲+0,夏季爲+1。

+1

準確地說。 GMT總是格林尼治標準它沒有夏令時。例如:瑞典時間爲冬季GMT + 1,夏季GMT + 2。 – jgauffin 2011-02-10 09:45:27

相關問題