【问题标题】:Convert discrete non-UTC date/time parts to a UTC DateTimeOffset将离散的非 UTC 日期/时间部分转换为 UTC DateTimeOffset
【发布时间】:2020-01-01 06:43:42
【问题描述】:

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

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

我意识到我可能过度思考/微优化,但由于我是 Noda Time 的新手,我主要是问是否有一种方法可以减少步骤或者在某些方面更好。 (我知道InZoneStrictly 可以抛出异常,这实际上与调度系统有关,所以我绝对不想要无效或自动调整的结果。)

【问题讨论】:

  • 这对我来说很好——如果你选择“你必须从什么开始”(一个本地日期/时间和一个时区)和“你想结束什么”(一个偏移量为 0 的 DateTimeOffset,因为您想要 UTC 值)那么这些转换似乎完全合适。

标签: c# nodatime


【解决方案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 已更新为在这种情况下通常做正确的事情(第一次出现模棱两可的值,跳过无效值)。调度是此决定的主要用例。

【讨论】:

  • 谢谢,我正在转换为 DateTimeOffset 以便将未来的事件写入 SQL,但系统的其余部分是基于 Instant 的。据我了解,与序列化Instant 相比,这是一种合适的列类型。我最近离开了InZoneLeniently,但我会重新考虑。离散值是配置项,必须在很长一段时间(可能是几年)内重新评估以产生新的未来计划目标,并且它是一种对错过调用具有弹性的系统,所以我认为跳过无效事件是合理的(主要是 DST过渡)。
猜你喜欢
  • 2021-12-31
  • 2012-12-05
  • 1970-01-01
  • 2011-01-06
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多