将 .net core TimeZoneInfo 与 momentjs 结合使用的最佳做法是什么?

What's the best practice for using .net core TimeZoneInfo with momentjs?

我们根据 .netcore TimeZoneInfo 生成的列表存储用户的时区。从那里,我们允许最终用户使用存储在数据库中的选择器指定日期和时间。所有这些都工作正常。用户选择日期和时间,知道时区指定“where”。

但是在前端,我们使用 momentJS 进行格式化。因为我也知道前端的 timezoneinfo Id 是什么,所以我想知道是否可以将日期和 timezoneid 插入 momentjs 以使用 .format() 命令来操作日期。

我正在考虑放弃 momentjs,并在后端格式化日期,但 momentjs 为我们的 UI 设计人员提供了灵活性,而无需重新部署。

想法?

几件事:

  • 您真的应该考虑用更现代的库替换 Moment。请阅读 Moment Project Status(我写的)以获取更多详细信息。

    • 如果您要继续使用 Moment,您还需要 Moment-Timezone add-on library to work with time zones. If you choose a library such as Luxon 作为替代,时区支持是 built-in.

    • 或者,您可以考虑使用 Date.toLocaleStringtimeZone 选项。如果满足您的需求,那么您根本不需要图书馆。

  • TimeZoneInfo .NET 中的对象将它们的 Id 属性 与它们 运行 所在的平台对齐。也就是说,您在 Windows 上获得 Windows ID,在 Linux 和 macOS 上获得 IANA ID。如果您不熟悉其中的区别,您应该阅读 the timezone tag wiki.

  • Windows 时区 ID 对 JavaScript 库没有用。您将始终需要使用 IANA ID。

    • 如果您是 运行 您在 Linux 上的服务器,您的 TimeZoneInfo.Id 属性 中已经有 IANA 值,并且都已设置。您可以直接在 JavaScript.

      中使用它们
    • 如果您 运行 您的服务器在 Windows 上,并且正在使用 .NET 6 或更新版本并且在 ICU installed, you can use TimeZoneInfo.TryConvertWindowsIdToIanaId to get the required IANA ID from a Windows ID. You can read more about this in the blog post I wrote for Microsoft.[=23 的系统上=]

    • 如果您在 Windows 上 运行 并且在 .NET 5 或更低版本上,或者在没有安装 ICU 的旧 Windows 上,您可以使用我的TimeZoneConverter 在 Windows 和 IANA ID 之间转换的库。