linux - 在 Linux .NET Core 上生成类似于 Windows 的友好时区名称列表
问题描述
我们有一个在 Windows 下运行的 .NET 4.7 MVC 5 Web 应用程序,它允许用户使用标准 Windows 显示名称选择他们的时区,例如(UTC+00:00) Dublin, Edinburgh, Lisbon, London
:
我们希望通过使用 .NET Core 2.0 构建的新 API 提供相同的时区选项列表,该 API 将在 Linux docker 容器中运行。这可能吗?
我找到了Matt Johnson出色的TimeZoneConverterGMT Standard Time
包,它在 Windows和 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
----
(UTC+10:00) Canberra, Melbourne, Sydney
在 Linux docker 容器中运行时,有什么方法可以获取(比如说) ?
到目前为止我想到的可能的黑客或解决方法:
- 在 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);
推荐阅读
- amazon-web-services - csv 文件中金额列中的值被插入另一列
- sql - 为什么记录没有得到进入日期的纠察队?
- .net - 遍历子类的最佳实践
- regex - 使用正则表达式匹配精确的两位数
- asp.net-mvc - 使用 ASP.Net MVC 5 在网站中集成 Paytm 支付
- flutter - 如何修复响应容器内 ListView 上的溢出错误
- java - 使用具有毫秒级滚动的 RollingFileAppender 时出现 Log4j2“无法移动文件”错误
- ios - 列表视图真的很慢而且很滞后
- android-fragments - 如何在捆绑中传递改造数据以查看活动中的寻呼机片段?
- angular - 如何最小化角度模块中的大量导入语句?