2017-01-30 1 views
2

존재할 경우 날짜 시간을 확인하는 방법이 있습니까?현지 날짜 시간 확인 NODA TIME

낮 시간 절약을 특정 지역 (예 : America/New_york 3 월 12 일)에 적용하면 소리가 날 수 있습니다. 2017 2am ~ 3am은 일광 절약 시간입니다. 2017 2am에서 2:59 am 그것은 그들의 시간에 존재하지 않습니다. 그것이 내가이

받은 datetime = 월 (12) 2017을 사용하여 시도

존재하는 경우 내가 오전 2시 반

var timeZoneProvider = DateTimeZoneProviders.Tzdb.GetZoneOrNull("America/New_York"); 
var localDate = LocalDateTime.FromDateTime(dateTime); 
var result = timeZoneProvider.AtStrictly(localDate).ToDateTimeUtc(); 
가 발생

오류는 방식이 지정된 날짜 시간을 확인하고 싶어 AtStrictly를 사용하기 전에 유효성을 검사합니까? 그것이 어디서 오류를 던져서 날짜 시간이 존재하지 않는지를 나타냅니다. 이것은 해당 영역의 DayLight Saving 때문입니다.

답변

2

DateTimeZone.MapLocal 메서드는이 정보를 제공 할 수 있습니다. 다음과 같이 쉽게 확장 할 수있는 확장 방법이 있습니다.

public static bool IsInvalidTime(this DateTimeZone tz, LocalDateTime ldt) 
{ 
    return tz.MapLocal(ldt).Count == 0; 
} 

public static bool IsAmbiguousTime(this DateTimeZone tz, LocalDateTime ldt) 
{ 
    return tz.MapLocal(ldt).Count > 1; 
} 

이 그럼 당신은 봄에이 같은 일을 할 수있다. (어딘가 정적 클래스에 넣어) :

var timeZone = DateTimeZoneProviders.Tzdb["America/New_York"]; 
var localDateTime = new LocalDateTime(2017, 3, 12, 2, 30); 

if (timeZone.IsInvalidTime(localDateTime)) { ... true ... } 

과 가을 : 물론

var timeZone = DateTimeZoneProviders.Tzdb["America/New_York"]; 
var localDateTime = new LocalDateTime(2017, 11, 5, 1, 30); 

if (timeZone.IsAmbiguousTime(localDateTime)) { ... true ... } 

, 이것은 단지 당신이 pre-validate하기를 원한다고 가정합니다. 일부 변환 규칙을 실제로 적용하려면 AtLeniently 또는 ResolveLocal(... your custom rules ...)이 올 것입니다.