将离散的非 UTC date/time 部分转换为 UTC DateTimeOffset

Convert discrete non-UTC date/time parts to a UTC DateTimeOffset

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

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

我知道我可能是 overthinking/micro-optimizing,但由于我是 Noda Time 的新手,所以我主要想问一下是否有一种方法可以减少步骤或者在某些方面更好。 (我知道InZoneStrictly会抛出异常,这其实和调度系统有关,所以我绝对不希望出现无效或自动调整的结果。)

您的实现很好,尽管您可以使用 DateTimeZone.Utc 而不是 utcTimeZone

这是另一个会产生相同结果的实现:

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

您可能会考虑您是否真的需要 DateTimeOffset。除非你打电话给其他需要一个 API 的人,否则你可以使用 OffsetDateTime 或只使用 Instant

至于关于 InZoneStrictly 的部分,考虑到用户可能会传递一组完全有效的日期和时间值,而这些值恰好在给定时区内不明确,因为它们代表了本地时间向后转换(DST 或标准时间的更改)。你真的想在这种情况下抛出吗?

此外,请考虑如果您有在多天的同一时间应用每日重复的逻辑,最终您可能 运行 在向前转换的间隙期间进入无效时间(同样对于 DST或更改标准时间)。

在 Noda Time 2.x 中,InZoneLeniently 已更新为通常在这种情况下做正确的事情(第一次出现不明确的值,跳过无效值)。调度是这个决定的主要用例。