使用Noda Time解析不明确的日期时间

The*_*heQ 6 .net c# nodatime

我使用Noda Time,并具有以下代码:

var pattern = ZonedDateTimePattern.CreateWithInvariantCulture(
    "yyyy-MM-dd HH:mm:ss z", 
    DateTimeZoneProviders.Tzdb);

var parsed = pattern.Parse("2017-11-05 01:00:00 America/Los_Angeles");
Console.WriteLine(parsed.Value);
Run Code Online (Sandbox Code Playgroud)

结果为UnparsableValueException

本地日期/时间在目标时区中不明确

据我了解,问题在于由于夏令时,该特定时间可能会发生两次。在02:00,时钟返回1小时至01:00。NodaTime不知道该字符串所指的是01:00的哪个“版本”,并且因此引发了异常。

对我来说,解析产生的时间版本并不重要,我只想避免出现异常,并获得尽可能接近实际的日期。一小时或更短的时间可以。最好的方法是什么?

我能想到的唯一方法是拆分字符串并分别解析各个部分,然后再添加一个小时,但这感觉是完全错误的。有更好的解决方案吗?

Ste*_*edy 5

ZonedDateTimePattern类有一个Resolver属性。解析程序的作用是执行到分区日期/时间的映射,并处理跳过的时间和不明确的时间-无法映射的时间,因为DST 永远不会(跳过)或多次(模糊)。

ZonedDateTimePattern源代码表明,默认的解析器是Resolvers.StrictResolver。您已经发现,如果映射不明确或被跳过,此解析器将引发异常。

可以使用各种解析器。最适合您的“请给我一个有效的日期和时间!” 需求可能是LenientResolver行为如下:

通过返回较早的出现来处理歧义,并且跳过的时间向前移动该间隔的持续时间。

我们可以通过WithResolver()ZonedDateTimePattern实例上附加一个调用来指定此解析器(该Resolver属性没有公共设置器):

var pattern = ZonedDateTimePattern.CreateWithInvariantCulture(
    "yyyy-MM-dd HH:mm:ss z",
    DateTimeZoneProviders.Tzdb).WithResolver(Resolvers.LenientResolver);

var parsed = pattern.Parse("2017-11-05 01:00:00 America/Los_Angeles");
Console.WriteLine(parsed.Value);
Run Code Online (Sandbox Code Playgroud)

输出:

2017-11-05T01:00:00 America / Los_Angeles(-07)