Localization 如何获取NodaTime中的时区列表

Localization 如何获取NodaTime中的时区列表,localization,timezone,nodatime,Localization,Timezone,Nodatime,如何从NodaTime获得“时区”列表,以便我可以制作一个如下所示的UI供我的用户选择 我想显示UTC偏移量,然后显示相应的城市/国家/地区。它不需要完全像下面那样,但是你知道,接近的东西 DateTimeZone没有name属性,并且ToString()ing生成重复项(从IDateTimeZoneProvider的id列表中) 我看到您可以使用TzdbDateTimeZoneSource.Default.ZoneLocations从~countries到zone,但这也不是我想要的。我可以看

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

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

DateTimeZone
没有name属性,并且
ToString()
ing生成重复项(从
IDateTimeZoneProvider的
id
列表中)

我看到您可以使用
TzdbDateTimeZoneSource.Default.ZoneLocations
从~countries到zone,但这也不是我想要的。我可以看到如何将这两个数据源拼凑在一起,但这感觉像是一个解决了的问题,我不应该再重新发明


野田佳彦目前没有为时区提供面向用户的字符串,没有

最好的数据来源是。我们对此有一个解决方案,但不幸的是,这从根本上说是棘手的。在某个时候,我想回到它,但我还没有找到时间:(

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

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

抱歉,目前的答案真的是“不,没有什么是盒子外的”——但这就是现实:(

< P>)你可以考虑使用NuGET包来获得IANA时区ID,例如纬度和经度,例如< /P>
//使用伦敦某地的坐标使用地理时区库
字符串tz=GeoTimeZone.TimeZoneLookup.GetTimeZone(50.4372,-3.5559).Result;//欧洲/伦敦
DateTimeZone DateTimeZone=DateTimeZoneProviders.Tzdb.GetZoneOrNull(tz);
//您可以在任何时刻获得UTC时间偏移量,可能如下所示
偏移量=日期时区
.GetUtcOffset(SystemClock.Instance.GetCurrentInstant());
控制台写入线(偏移量);//+01

您可以使用my library获得显示名称列表及其相应的IANA时区ID,适用于按照您描述的方式构建下拉列表。生成的ID与NodeTime的TZDB提供程序兼容

//您可以对该语言进行硬编码(例如:“en-US”),也可以从.NET全球化中获取该语言:
var languageCode=CultureInfo.CurrentUICulture.Name;
//然后获取名称,作为键/值对列表
var list=TZNames.GetDisplayNames(语言代码,useAnzoneId:true);
//根据您的意愿使用它们。例如:
foreach(列表中的变量名称)
{
Console.WriteLine($“{name.Key}=\”{name.Value}\”);
}
输出(截断):

Etc/GMT+12=“(UTC-12:00)国际日期线西”
Etc/GMT+11=“(UTC-11:00)协调世界时-11”
美洲/Adak=“(UTC-10:00)阿留申群岛”
太平洋/檀香山=“(UTC-10:00)夏威夷”
太平洋/Marquesas=“(UTC-09:30)Marquesas群岛”
美国/安克雷奇=“(UTC-09:00)阿拉斯加”
Etc/GMT+9=“(UTC-09:00)协调世界时-09”
美洲/蒂华纳=“(UTC-08:00)下加利福尼亚州”
Etc/GMT+8=“(UTC-08:00)协调世界时-08”
美国/洛杉矶=“(UTC-08:00)太平洋时间(美国和加拿大)”
美国/凤凰城=“(UTC-07:00)亚利桑那州”
美洲/奇瓦瓦语=“(UTC-07:00)奇瓦瓦、拉巴斯、马萨特兰”
美洲/丹佛=“(UTC-07:00)山地时间(美国和加拿大)”
美洲/危地马拉=“(UTC-06:00)中美洲”
美洲/芝加哥=“(UTC-06:00)中部时间(美国和加拿大)”
太平洋/复活节=“(UTC-06:00)复活节岛”
...
显示名称来源于Windows语言包。ID通过CLDR从Windows转换为IANA。如果您希望使用Windows ID,则可以将
useAzonneids
设置为
false
(或忽略它)

另请参见TimeZoneNames文档中的和