我使用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的哪个“版本”,并且因此引发了异常。
对我来说,解析产生的时间版本并不重要,我只想避免出现异常,并获得尽可能接近实际的日期。一小时或更短的时间可以。最好的方法是什么?
我能想到的唯一方法是拆分字符串并分别解析各个部分,然后再添加一个小时,但这感觉是完全错误的。有更好的解决方案吗?
本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)
| 归档时间: |
|
| 查看次数: |
369 次 |
| 最近记录: |