[使用Noda时间时,从一组离散的非UTC值(即,单独的年,月,日,小时,分钟值)到UTC DateTimeOffset变量是否还有更直接的方法?我正在循环执行以下操作,创建LocalDateTime
然后连续应用两个不同的时区似乎有些奇怪。
DateTimeOffset target =
new LocalDateTime(year, month, day, hour, minute)
.InZoneStrictly(dataTimeZone)
.WithZone(utcTimeZone)
.ToDateTimeOffset();
我意识到我可能会考虑过度/进行微优化,但是由于我是Noda Time的新手,所以我主要是问是否有一种方法可以减少步骤或在某种程度上更好。 (我知道InZoneStrictly
会引发异常,这实际上与计划系统有关,所以我绝对不希望无效或自动调整的结果。)
您的实现很好,尽管您可以使用DateTimeZone.Utc
代替utcTimeZone
。
这里是另一个将产生相同结果的实现:
DateTimeOffset target =
new LocalDateTime(year, month, day, hour, minute)
.InZoneStrictly(dataTimeZone)
.ToInstant()
.ToDateTimeOffset();
您可能会考虑实际上是否需要 DateTimeOffset
。除非您要调用某些其他需要API的API,否则可以使用OffsetDateTime
或仅使用Instant
。
关于InZoneStrictly
的部分,请考虑用户可能会传入一组完全有效的日期和时间值,而这些值恰好在给定时区内是模棱两可的,因为它们表示向后过渡期间的本地时间( DST或标准时间更改)。你真的想在这种情况下扔吗?
[另外,请考虑,如果您具有在多个天的同一时间应用每日重复的逻辑,则最终您可能会在向前过渡的间隔(同样是DST或标准时间更改)期间遇到无效时间。
在Noda Time 2.x中,将InZoneLeniently
更新为在这种情况下通常会做正确的事情(第一次出现歧义值,请先跳过无效值)。调度是此决策中的主要用例。