2011-02-10 67 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