无论操作系统如何,如何获取特定的TimeZoneInfo?

问题描述

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

好像我需要打电话给TimeZoneInfo.ConvertTimeFromUtc(myUtcDateTime,specificTimeZone),但是如何获取 specificTimeZone

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

解决方法

关于:

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

只有三种可能性可供考虑:

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

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

  • 该操作系统不是Windows,并且未安装时区数据。例如,具有有限存储空间的IoT设备和轻量级容器环境。值得注意的是,Alpine Linux发行版默认不包含tzdata软件包。在这种情况下,GetSystemTimeZones不返回任何内容,而FindSystemTimeZoneById总是抛出TimeZoneNotFoundException

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

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

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