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

标签 linux windows docker .net-core timezone

我们有一个在 Windows 下运行的 .NET 4.7 MVC 5 网络应用程序,它允许用户使用标准的 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 标准时间 和 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包可用于生成友好列表

最佳答案

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);

关于linux - 在 Linux .NET Core 上生成类似 Windows 的友好时区名称列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53300222/

相关文章:

python - 如何使用构造函数变量打开Python脚本

c++ - Windows和Linux之间的相对路径分辨率差异?

.net - Microsoft.SharePoint.PowerShell Snapin : Incorrect Windows PowerShell version 3. 0. 当前控制台支持 Window PowerShell 版本 2.0

docker - 如何在不同的代理上运行 Jenkins 并行 cypress?

c - 我们如何在两个不同的内核模块之间共享一个哈希表

linux - 如何使用 sed ssh 更改值

linux - 将输出发送到另一个命令

windows - 我可以在 COM 方法中传递 HWND 吗?

docker - Unhealthy 和 Degraded .NET 健康检查状态有什么区别

docker - 在一个容器中运行多个类似的进程是否有意义?