nodeatime中时区的长格式名称
本文关键字:格式 时区 nodeatime | 更新日期: 2023-09-27 18:16:05
在nodeatime中,如何找到给定tz时区id的时区的长格式名称?
例如,如果输入"America/los - angeles ",则应该返回"Pacific Standard Time"。
生成时区名称"长格式"所需的信息不在Noda time中,但它可以在CLDR中找到。
我最近整理了一个名为"时区名称"的库,它嵌入了CLDR时区名称。您可以将它们与Noda时区使用的IANA (TZDB)标识符一起使用。
- 从NuGet安装来源:GitHub
- 查看单元测试以获取示例使用和输出。
只需传递时区和语言,它将提供适当的通用名称、标准名称和日光名称。您可以使用Noda Time来决定适合显示哪个表单。
var names = TimeZoneNames.GetNamesForTimeZone("America/Los_Angeles", "en-US");
Assert.Equal("Pacific Time", names.Generic);
Assert.Equal("Pacific Standard Time", names.Standard);
Assert.Equal("Pacific Daylight Time", names.Daylight);
对于语言,您可以传递两个数字的代码,如"en"
,也可以传递完全区域化的版本,如"en-US"
。这与CultureInfo
名称一致,因此如果您喜欢,可以传递CultureInfo.CurrentUICulture.Name
。
TZDB本身不包含时区的描述:ID为America/Los_Angeles
的时区仅包含名称为"PDT"answers"PST"的转换。所以从这个角度来看,数据根本不存在。
也就是说,您可以获得映射到给定TZDB区域的Windows时区id(最初来自CLDR windowsZones.xml
数据),并且Windows通常使用像"太平洋标准时间"这样的名称作为其区域id。
。
var source = TzdbDateTimeZoneSource.Default;
var windowsIds = (from item in source.WindowsMapping.PrimaryMapping
where item.Value == "America/Los_Angeles"
select item.Key).ToList();
但是,这种方法有一些注意事项:
- 如上所示,可能有任意数量的Windows区域id映射到给定的TZDB区域。在当前的数据中,这总是0或1 (
- 一些Windows区域id不是特别好:例如,
Europe/London
是从一个名为"GMT标准时间"的Windows区域映射的,这不是一个很好的字符串显示给用户。
Europe/Vienna
是一个没有Windows zone ID使用的TZDB区域的例子),但理论上没有理由你找不到两个或更多的Windows zone ID映射到同一个TZDB区域。但是,对于您正在做的事情,这可能是可以接受的。
简短回答:https://github.com/barrycarter/bcapps/blob/master/ASTRO/tz2name.txt
长话短说:正如其他人注意到的,您可以使用CLDR的common/supplemental/metaZones.xml
文件将时区映射到地区。例如:
<timezone type="America/Barbados">
<usesMetazone mzone="Atlantic"/>
</timezone>
将时区"America/Barbados"映射到地区"Atlantic"。
然后可以使用common/main/en.xml
将区域转换为时区名称。例如:
<metazone type="Atlantic">
<long>
<generic>Atlantic Time</generic>
<standard>Atlantic Standard Time</standard>
<daylight>Atlantic Daylight Time</daylight>
</long>
<short>
<generic>AT</generic>
<standard>AST</standard>
<daylight>ADT</daylight>
</short>
</metazone>
告诉我们"大西洋"地区使用的时区名称(长格式和短格式)。
这几乎是对其他答案的重复,但是直接引用了所讨论的文件