.NET Core时区跨平台的问题

时间:2022-06-25
本文章向大家介绍.NET Core时区跨平台的问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在.NET Core中开发跨多个操作系统的应用程序时,使用时区信息,可能会给不熟悉操作系统管理时区管理方式差异的开发人员带来意外的结果。在这篇文章中,我们将探讨这些差异及其带来的问题。

重现问题

假设您正在.NET Core中编写控制台应用程序,并且希望获取有关特定时区的信息。你可以这样写:

static void Main(string[] args)
{
    TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
    Console.WriteLine(tzi.DisplayName);
}

在我的 Windows 10 开发机上运行,可以看见下面的结果

(UTC-06:00) Central Time (US & Canada)

如果我将相同的代码块拿到 Ubuntu 18.04 开发环境中运行它,我反而看到下面的异常:

Exception has occurred: CLR/System.TimeZoneNotFoundException

An unhandled exception of type 'System.TimeZoneNotFoundException' occurred in System.Private.CoreLib.dll: 'The time zone ID 'Central Standard Time' was not found on the local computer.'

这是怎么回事?让我们花一点时间去挖掘一下,看看到底发生了什么。

时区差异

Windows 系统在注册表中维护其时区列表。您可以在这里(https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/default-time-zones)找到这些值的列表。

当您专门使用这两种格式之一编写 .NET Core 代码,然后尝试在另一个操作系统上运行应用程序时,问题就会出现。由于运行时将时区管理交给底层操作系统,因此在这种情况下,您需要自己处理差异。

我们如何解决这个问题?

GitHub 上有一个开源项目可以解决这些差异。在这里查看项目开发人员和维护者提供的源代码(https://github.com/mj1856/TimeZoneConverter)。您可以通过 NuGet 通过以下命令获取包:

Install-Package TimeZoneConverter

一旦安装了它, 您就可以以统一的方式使用不同的操作系统时区服务。

TimeZoneInfo tzi = TZConvert.GetTimeZoneInfo("Central Standard Time");

TimeZoneInfo tzi = TZConvert.GetTimeZoneInfo("America/New_York");

时区数据经常更改,如项目文档中所述,请确保及时更新此包。