timezonnames标准、日光、通用用法



在尝试区分山地时区和亚利桑那州(我意识到它们都是山地时间)时,我发现GetNamesForTimeZone("America/Phoenix", "en-us")返回一个日光名称。

我应该依靠外部代码(节点时间)来确定时间是否为该时区的日光,或者是否有一种方法可以从TimeZoneNames函数知道,如果一个区域没有夏令时?

在同样的注意事项上,使用"通用"名称作为时区名称而不是标准与日光的用例是什么?

据我所知,TimeZoneNames只是关于时区名称本身——它不知道任何关于时区数据本身的信息。

如果你想知道美国/凤凰城目前是否在实行夏令时,我肯定会使用野田时间本身:

// Usually pass in System.Clock.Instance as the clock...
// or take an Instant instead.
public bool IsCurrentlyObservingDaylightSavings(string id, IClock clock)
{
    var zone = DateTimeZoneProviders.Tzdb[id];
    var now = clock.Now;
    var zoneInterval = zone.GetZoneInterval(now);
    return zoneInterval.Savings != Offset.Zero;
}

我可能会在2.0中添加一个DateTimeZone.InDaylightSaving(Instant)方法…

作为TimeZoneNames库的作者,我可以解释为什么会发生这种情况。

首先,America/Phoenix映射到CLDR metaZones.xml文件中的America_Mountain元分区

<timezone type="America/Phoenix">
    <usesMetazone mzone="America_Mountain"/>
</timezone>

其他时区也在同一元区域:

<timezone type="America/Denver">
    <usesMetazone mzone="America_Mountain"/>
</timezone>

然后,在每个CLDR语言文件中,例如用于英语的en.xml文件,您将看到America_Mountain元区域条目及其本地化字符串:

<metazone type="America_Mountain">
    <long>
        <generic>Mountain Time</generic>
        <standard>Mountain Standard Time</standard>
        <daylight>Mountain Daylight Time</daylight>
    </long>
    <short>
        <generic>MT</generic>
        <standard>MST</standard>
        <daylight>MDT</daylight>
    </short>
</metazone>

因此,CLDR中没有关于DST是否适用于亚利桑那州的信息。请记住,亚利桑那州确实有DST在过去-最后在1967年。因此,如果没有像在野田时间中那样的TZDB数据,您就无法确定夏令时在某个特定时间点是否有效。

Jon的回答显示了如何使用野田时间测试夏时制是否有效。得到结果后,可以相应地从timezonnames中选择标准字符串或日光字符串。

至于通用名称,通常是指一般的时区,而不是指夏令时部分或标准时间部分。其中一个用例是时区选择,如下所示。

相关内容

  • 没有找到相关文章

最新更新