2014-10-06 2 views
0

어제 우루과이가 자신의 시계를 변경 전환, 그 시간대에 대한 특정 시간을 변환 할 때 지금은 예외를보고 계속 :NodaTime - 시간이 지나면 오류

ERROR Exception: - DateTime ConvertTimeToUtc(DateTime, String) (05/10/2014 02:31:00, America/Montevideo) 
NodaTime.SkippedTimeException: Specified argument was out of the range of valid values. 
Parameter name: Local time 05/10/2014 02:31:00 is invalid in time zone America/Montevideo 

나는 현지 시간이 잘못 될 수있는 방법을 이해 :

"예를 들어 시간대가 오전 2시에 진행된다고 가정하면 01:59:59 이후의 초는 03:00:00이되고 02:30:00과 같은 현지 시간은 결코 발생하지 않습니다."

그러나 내가 알지 못하는 것 (그리고 아마도 더 많은 커피가 필요합니다)이 이유는 NodaTime이 이것을 설명하지 않는 이유입니까? 02:31이 현재 현지 시간이 잘못되었음을 인식하지 못합니까? 아니면이 문제를 처리하기 위해 추가 처리를해야합니까?

기능 내가 전화 해요 :

var timeZone = DateTimeZoneProviders.Tzdb[timezoneName]; 
var localTime = LocalDateTime.FromDateTime(timeToConvert).InZoneStrictly(timeZone);; 
return DateTime.SpecifyKind(localTime.ToDateTimeUtc(), DateTimeKind.Utc); 

답변

1

네, 는 잘못된 현지 시간하다는 알고있다 - 특별히 UTC로이 현지 시간으로 변환을 요청할 때 왜 그것이를 슬로우 예외. 대략 Math.sqrt(-1)을 호출하는 것과 같습니다.

특히 호출은 모호하거나 건너 뛴 시간에 예외를 발생시킵니다. InZoneLeniently을 사용하면 예외가 발생하지 않지만 원하는 결과를 제공하지 못할 수 있습니다. 또는 LocalDateTime.InZone(DateTimeZone, ZoneLocalMappingResolver)을 사용하면 잘못된 현지 날짜/시간 값을 원하는대로 매핑 할 수 있습니다. - ToDateTimeUtc 항상 종류와 DateTime를 반환합니다

  • 귀하의 localTime 변수가 ZonedDateTime, 그래서 이름이 조금
  • 오해의 소지가있다 당신은 SpecifyKind 호출 할 필요가 없습니다 : 사이드 노트로

    Utc, 따라서 이름.

+0

답변 해 주셔서 감사합니다. 질문에 호출하는 함수를 추가했습니다. 이제는 UTC로 현지 시간을 변환 할 때 오류가 발생한다는 것을 이해합니다. 처음에 현지 시간을 얻기 위해 다른 것을해야합니까? – FBryant87

+0

@ FBryant87 : 솔직히 말해서, 당신이 달성하고자하는 것이 무엇인지 명확하게 밝히지 않았습니다 - 어디서'timeToConvert'를 얻었습니까? 어떤 경우에는 합리적인 데이터 일 수 있습니다. 매일 오전 2시 30 분에 반복되는 이벤트가있는 경우 ... 하루에 2 시간 30 분이 0 또는 2 번 발생하는 날의 의미를 알아 내야합니다. –

+0

감사합니다. 업데이트 된 답변에서 조금 더 설명 하겠지만 InZoneLeniently에서 읽어 볼 것입니다. – FBryant87

관련 문제