首页 > 解决方案 > 与 NodaTime 一起使用的其他软件包

问题描述

我正在更新一个应用程序以使用NodaTime来修复我们的数据和流程的许多现有时间问题。

我需要从发送 IANA 时区名称的移动应用程序中解析时区。我需要支持使用自定义偏移量(即硬编码-04:00)转换为UTC。我可能需要也可能不需要支持 Windows 时区名称。

对于所有这些,我想知道我是否需要额外的软件包。TimeZoneConverterTimeZoneNames如何与 NodaTime 一起工作?我应该与 NodaTime 一起使用其他附加软件包吗?

我们的最终目标是让所有数据以 Utc 格式保存,并转换为/从用户时间转换,仅用于显示或接受用户输入。

标签: nodatime

解决方案


据我所知,您不需要任何额外的软件包来解决这种情况。

  • 对于 IANA ID,只需使用DateTimeZoneProviders.Tzdb
  • 对于“原始偏移”ID,您可以使用任何时区提供程序,要求提供“UTC+01:00”等形式的 ID(因此您需要添加“UTC”前缀。)
  • 对于 Windows 区域映射,您可以使用TzdbDateTimeZoneSource.Default获取默认的 TZDB 信息,然后使用该WindowsMapping属性获取WindowsZones可用于映射的对象。

TimeZoneConverter最后一个要点可能更容易使用,但这不是必需的。它提供的 IANA ID应该适用于 Noda Time。

TimeZoneNames更多关于向用户显示时区名称。如果你不需要这样做,你可能不需要这个包。

请注意,将所有数据保存为 UTC可能是一个非常糟糕的主意 - 如果不了解您的应用程序的更多信息,就很难判断。如果您只处理过去的值,或者它们是固定的瞬间,那很好。但是,如果您允许用户安排未来的事件,我会存储用户给您的值。这是为什么...

假设用户说他们想在 2021 年 12 月 1 日上午 9 点为欧洲/巴黎安排一个活动。如果你现在将它转换为 UTC ,你最终会得到 2021-12-01T08:00Z,因为当前时区规则说巴黎将于 2021 年 12 月为 UTC+1。

但是,从现在到 2021 年,法国完全有可能将其时区规则更改为“永久日光时间”,即全年 UTC+2。届时,您的 UTC 值 2021-12-01T08:00Z 将对应于给定日期的巴黎上午 10 点 - 与用户指定的相反。

也可以转换为 UTC 这样您就可以创建一个完全有序的数据视图,只要您保留足够的信息以在每次有新时区数据时再次执行该转换。

正如我所说,这对您来说可能不是问题,但值得知道的是,“始终以 UTC 存储所有内容”的“公认智慧”对于所有情况来说确实不是一个好建议。


推荐阅读