如何获取 NodaTime 中的时区列表

And*_*ock 5 .net timezone localization nodatime

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

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

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

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

示例列表

Mat*_*int 5

您可以使用我的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}\"");
}

Run Code Online (Sandbox Code Playgroud)

输出(截断):

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"
...
Run Code Online (Sandbox Code Playgroud)

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

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


Jon*_*eet 4

Noda Time 目前不提供面向用户的时区字符串,不。

最好的数据来源是CLDR。我们对此有一个长期存在的问题,但不幸的是它从根本上来说很棘手。在某个时候我想回到它,但我还没有找到时间:(

您可以使用Onism.Cldr项目来访问 CLDR 数据。不过,您需要从两个方面了解 CLDR 数据的工作原理:

  • 时区数据结构,例如元区域
  • 文本数据结构允许您获取用户选择的语言的特定字符串资源

抱歉,目前的答案实际上只是“不,没有任何现成的东西” - 但这就是现实:(