在Linux .NET Core上生成类似Windows的友好时区名称列表

时间:2018-11-14 12:26:01

标签: linux windows docker .net-core timezone

我们有一个.NET 4.7 MVC 5 Web应用程序,该应用程序在Windows下运行,允许用户使用标准Windows显示名称(例如(UTC+00:00) Dublin, Edinburgh, Lisbon, London)选择时区:

Windows time zone display names

我们希望通过使用.NET Core 2.0构建的新API提供相同的时区选项列表,该API将在Linux docker容器中运行。这可能吗?

我发现Matt Johnson's很棒的TimeZoneConverter软件包,在Windows的GMT Standard Time和IANA的Europe/London之间转换方面做得很好。但是,我似乎无法从任何地方获得Windows显示名称。

下面是一些示例代码,列出了一些时区信息:

var timeZoneIds = TimeZoneConverter.TZConvert.KnownWindowsTimeZoneIds.ToList();

foreach (var timeZoneId in timeZoneIds.Take(4))
{
    if (TimeZoneConverter.TZConvert.TryGetTimeZoneInfo(timeZoneId, out var timeZoneInfo))
    {
        Console.WriteLine($"Windows Id:   {timeZoneId}");
        Console.WriteLine($".NET Id:      {timeZoneInfo.Id}");
        Console.WriteLine($"Display name: {timeZoneInfo.DisplayName}");
        Console.WriteLine("----");
    }
}

在Windows开发计算机上运行时,它会显示以下输出:

Windows Id:   AUS Central Standard Time
.NET Id:      AUS Central Standard Time
Display name: (UTC+09:30) Darwin
----
Windows Id:   AUS Eastern Standard Time
.NET Id:      AUS Eastern Standard Time
Display name: (UTC+10:00) Canberra, Melbourne, Sydney
----
Windows Id:   Afghanistan Standard Time
.NET Id:      Afghanistan Standard Time
Display name: (UTC+04:30) Kabul
----
Windows Id:   Alaskan Standard Time
.NET Id:      Alaskan Standard Time
Display name: (UTC-09:00) Alaska
----

在Linux docker容器中运行时,我们得到以下信息:

Windows Id:   AUS Central Standard Time
.NET Id:      Australia/Darwin
Display name: GMT+09:30
----
Windows Id:   AUS Eastern Standard Time
.NET Id:      Australia/Sydney
Display name: GMT+10:00
----
Windows Id:   Afghanistan Standard Time
.NET Id:      Asia/Kabul
Display name: GMT+04:30
----
Windows Id:   Alaskan Standard Time
.NET Id:      America/Anchorage
Display name: GMT-09:00
----

在Linux docker容器中运行时,有什么方法可以获取(说)(UTC+10:00) Canberra, Melbourne, Sydney

到目前为止我可能想到的黑客或变通方法:

  • 在API源中对Windows显示名称列表进行硬编码
  • 从我们已有的信息中生成一个“足够好”的显示名称,例如(GMT+10:00) AUS Eastern Standard Time
  • 看看Matt Johnson的TimeZoneNames软件包是否可以用来生成友好列表

1 个答案:

答案 0 :(得分:1)

现在,TimeZoneNames版本4.0.0可以实现此功能。

string languageCode = CultureInfo.CurrentCulture.IetfLanguageTag; // ex: "en-US"
var displayNames = TZNames.GetDisplayNames(languageCode);

结果是一个字典,其中的键是时区的Windows ID,值是本地化的显示名称。

如果您想返回IANA时区名称作为键,则将true作为可选的第二个参数传递:

var displayNames = TZNames.GetDisplayNames(languageCode, true);