nodeatime中时区的长格式名称

本文关键字:格式 时区 nodeatime | 更新日期: 2023-09-27 18:16:05

在nodeatime中,如何找到给定tz时区id的时区的长格式名称?

例如,如果输入"America/los - angeles ",则应该返回"Pacific Standard Time"。

nodeatime中时区的长格式名称

生成时区名称"长格式"所需的信息不在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 (Europe/Vienna是一个没有Windows zone ID使用的TZDB区域的例子),但理论上没有理由你找不到两个或更多的Windows zone ID映射到同一个TZDB区域。
  • 一些Windows区域id不是特别好:例如,Europe/London是从一个名为"GMT标准时间"的Windows区域映射的,这不是一个很好的字符串显示给用户。

但是,对于您正在做的事情,这可能是可以接受的。

简短回答: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>

告诉我们"大西洋"地区使用的时区名称(长格式和短格式)。

这几乎是对其他答案的重复,但是直接引用了所讨论的文件