我们有一个在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'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
?
到目前为止我想到的可能的黑客攻击或变通办法:
(GMT+10:00) AUS Eastern Standard Time
现在可以使用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);