【问题标题】:How to get a specific TimeZoneInfo regardless of OS?无论操作系统如何,如何获取特定的 TimeZoneInfo?
【发布时间】:2020-12-09 22:09:56
【问题描述】:

在 .NET Core 中,我想简单地将 UTC 日期时间转换为特定时区中的日期时间。

看来我需要调用TimeZoneInfo.ConvertTimeFromUtc(myUtcDateTime, specificTimeZone),但是如何获取specificTimeZone

使用TimeZoneInfo.FindSystemTimeZoneById("My timezone name") 似乎有风险,因为我想在可能有自己的时区名称的不同系统中使用此功能。

【问题讨论】:

  • 我能知道转换的原因吗,你想在哪里显示转换的时间?在用户界面上?
  • 当然。为方便起见,我的系统使用 UTC 时间,但我正在与希望在其本地时间接收日期的客户集成。

标签: c# .net .net-core time timezone


【解决方案1】:

关于:

我想在可能有自己的时区名称的不同系统中使用此功能。

只有三种可能性需要考虑:

  • 操作系统是 Windows。 FindSystemTimeZoneByIdGetSystemTimeZones 使用 Windows 时区。例如,"Romance Standard Time" 是法国时间的标识符。

  • 操作系统不是 Windows(OSX、Linux 等),并且系统安装了时区数据(例如,tzdata 包)。 FindSystemTimeZoneByIdGetSystemTimeZones 使用 IANA 时区。例如,"Europe/Paris" 是法国时间的标识符。

  • 操作系统不是 Windows,并且没有安装时区数据。例如,存储有限的物联网设备和轻量级容器环境。值得注意的是,Alpine Linux 发行版默认不包含 tzdata 包。在这种情况下,GetSystemTimeZones 什么都不返回,FindSystemTimeZoneById 总是抛出一个TimeZoneNotFoundException

对于前两个问题,您可以利用我的TimeZoneConverter 库。它将允许您在任一平台上使用任一形式的标识符。

对于最后一个问题,要么你需要在操作系统上安装tzdata,要么你需要自带tzdata,比如Noda Time提供的库。

最后,我要指出,操作系统上的任何时区数据都必须保持更新。否则,您的代码有可能存在新创建的时区,但包含它的更新尚未到达计算机。所有现代操作系统都会自动执行此操作,除非您专门将它们配置为不(例如 Windows 更新等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 2010-10-08
    • 2021-05-15
    • 2012-04-18
    • 2016-04-18
    • 1970-01-01
    相关资源
    最近更新 更多