与 NodaTime 一起使用的附加包

Additional packages to use with NodaTime

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

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

对于所有这些,我想知道我是否需要额外的包。 TimeZoneConverter and TimeZoneNames 如何与 NodaTime 一起工作?除了 NodaTime,我还应该使用其他任何其他软件包吗?

我们的最终目标是将所有数据持久保存为 Utc 并将 to/from 用户时间转换为仅用于显示或接受用户输入。

据我所知,您不需要为该场景添加任何额外的包。

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

TimeZoneConverter 对于最后一个要点可能更容易使用,但这不是必需的。它提供的 IANA ID 应该 可以与 Noda Time 一起正常工作。

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

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

假设用户说他们想在 2021 年 12 月 1 日上午 9 点安排 Europe/Paris 的活动。如果您将其转换为 UTC now,您将结束到 2021-12-01T08:00Z,因为当前时区规则规定巴黎将在 2021 年 12 月使用 UTC+1。

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

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

正如我所说,这对您来说可能不是问题,但值得一提的是 "Always store everything in UTC" 的 "received wisdom" 对 all[=46 来说确实不是个好建议=] 场景。