检查本地日期时间是否存在NODA TIME

时间:2017-01-30 05:15:02

标签: c# nodatime

有没有办法验证日期时间是否确实存在?

这可能听起来很奇怪,但如果您将白天节省时间应用于某个区域,例如America / New_york 3月12日。2017年凌晨2点到凌晨3点是他们的夏令时。从3月12日开始的文学演讲。2017年凌晨2点到凌晨2点59分,他们的时间不存在。我想验证给定的日期时间是否存在

我尝试使用此

给定dateTime = 3月12日。2017年2:30凌晨

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

它会抛出并且错误是否有一种方法可以在使用AtStrictly之前验证它?它抛出错误并说日期时间不存在的原因是由于该区域中的DayLight Saving

1 个答案:

答案 0 :(得分: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 ... }

当然,这假设您只想预先验证。如果您想要实际应用某些转换规则,那么AtLenientlyResolveLocal(... your custom rules ...)会出现这些规则。