将离散的非UTC日期/时间部分转换为UTC DateTimeOffset

问题描述 投票:1回答:1

[使用Noda时间时,从一组离散的非UTC值(即,单独的年,月,日,小时,分钟值)到UTC DateTimeOffset变量是否还有更直接的方法?我正在循环执行以下操作,创建LocalDateTime然后连续应用两个不同的时区似乎有些奇怪。

DateTimeOffset target = 
    new LocalDateTime(year, month, day, hour, minute)
        .InZoneStrictly(dataTimeZone)
        .WithZone(utcTimeZone)
        .ToDateTimeOffset();

我意识到我可能会考虑过度/进行微优化,但是由于我是Noda Time的新手,所以我主要是问是否有一种方法可以减少步骤或在某种程度上更好。 (我知道InZoneStrictly会引发异常,这实际上与计划系统有关,所以我绝对不希望无效或自动调整的结果。)

c# nodatime
1个回答
1
投票

您的实现很好,尽管您可以使用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更新为在这种情况下通常会做正确的事情(第一次出现歧义值,请先跳过无效值)。调度是此决策中的主要用例。

© www.soinside.com 2019 - 2024. All rights reserved.