首页 > 解决方案 > 如何在 NodaTime 中获取时区列表

问题描述

如何从 NodaTime 获取“时区”列表,以便我可以制作如下 UI 供我的用户选择?

我想显示 UTC 偏移量,然后显示相应的城市/国家/地区。它不需要完全像下面的那样,但你知道的,很接近。

DateTimeZone没有 name 属性,并且ing 产生重复项(来自fromToString()的列表)。IdsIDateTimeZoneProvider

我看到你可以从〜国家到地区,TzdbDateTimeZoneSource.Default.ZoneLocations但那也不是我想要的。我可以看到如何将这两个数据源拼凑在一起,但这感觉像是一个已解决的问题,我不应该重新发明。

示例列表

标签: localizationtimezonenodatime

解决方案


您可以使用我的TimeZoneNames库获取显示名称列表及其对应的 IANA 时区 ID,适合以您描述的方式构建下拉列表。生成的 ID 与 NodaTime 的 TZDB 提供程序兼容。

// You can either hardcode the language (ex: "en-US"), or get it from .NET globalization:
var languageCode = CultureInfo.CurrentUICulture.Name;

// Then get the names, as a list of key/value pairs
var list = TZNames.GetDisplayNames(languageCode, useIanaZoneIds: true);

// Use them as you wish.  For example:
foreach (var name in list)
{
    Console.WriteLine($"{name.Key} = \"{name.Value}\"");
}

输出(截断):

Etc/GMT+12 = "(UTC-12:00) International Date Line West"
Etc/GMT+11 = "(UTC-11:00) Coordinated Universal Time-11"
America/Adak = "(UTC-10:00) Aleutian Islands"
Pacific/Honolulu = "(UTC-10:00) Hawaii"
Pacific/Marquesas = "(UTC-09:30) Marquesas Islands"
America/Anchorage = "(UTC-09:00) Alaska"
Etc/GMT+9 = "(UTC-09:00) Coordinated Universal Time-09"
America/Tijuana = "(UTC-08:00) Baja California"
Etc/GMT+8 = "(UTC-08:00) Coordinated Universal Time-08"
America/Los_Angeles = "(UTC-08:00) Pacific Time (US & Canada)"
America/Phoenix = "(UTC-07:00) Arizona"
America/Chihuahua = "(UTC-07:00) Chihuahua, La Paz, Mazatlan"
America/Denver = "(UTC-07:00) Mountain Time (US & Canada)"
America/Guatemala = "(UTC-06:00) Central America"
America/Chicago = "(UTC-06:00) Central Time (US & Canada)"
Pacific/Easter = "(UTC-06:00) Easter Island"
...

显示名称来自 Windows 语言包。ID 通过 CLDR 从 Windows 转换为 IANA。如果您想要 Windows ID,则可以设置useIanaZoneIdsfalse(或省略它)。

另请参阅TimeZoneNames 文档中列出时区的方法和致谢


推荐阅读