2011-02-10 2 views
2

내 서버가 CEST 시간을 보내고 DST 스위치를 제외하고 서버에서 수신 한대로 UI에 표시해야하는 상황에 있습니다. GMT의 모호한 시간은 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 영역에서 모호하지만, 호출이 실패합니다. 내 시스템이 영국 국가 별 설정으로 실행 중입니다.

나는 아래 테스트를 시도하고 통과한다. 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는 모호하지 않습니다. GMT는 항상 +0입니다. 런던의 시간대는 서유럽 시간으로, 겨울에는 +0, 여름에는 +1입니다.

+1

정확하게. GMT는 항상 GMT입니다. 그것은 일광 절약 시간이 없다. 예 : 스웨덴 시간은 겨울에는 GMT + 1이고 여름에는 GMT + 2입니다. – jgauffin

+0

WET는 GMT와 동의어이며 항상 GMT와 동일한 UTC + 0입니다. 여름철에는 WET/BST로 WET 스위치를 사용하는 대부분의 국가가 UTC + 1입니다. http://en.wikipedia.org/wiki/Western_European_Time – LukeH

+0

그렇다면 왜이 테스트가 통과합니까? (내 주요 질문에 대한 편집을 참조하십시오)? 질문은 GMT 시간대와 관련하여 InvalidTime과 AmbigousTime의 차이점은 무엇입니까? – Mike

관련 문제