1

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

我是否应该依靠外部代码(节点时间)来确定该时区的时间是否为日光时间,或者是否有办法仅从 TimeZoneNames 函数中知道某个区域是否没有夏令时?

同样,使用“通用”名称作为时区名称而不是标准与日光名称的用例是什么?

4

2 回答 2

2

据我所知,TimeZoneNames只是时区名称本身 - 它对时区数据本身一无所知。

如果您想知道 America/Phoenix 目前是否正在观察夏令时,我肯定会使用 Noda Time 本身:

// 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;
}

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

于 2016-09-21T15:46:40.370 回答
1

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

首先,America/Phoenix映射到America_MountainCLDR文件中的元区域metaZones.xml

<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 年因此,如果没有您在Noda Time中找到的 TZDB 数据,您将无法确定 DST 在某个特定时间点是否有效。

Jon 的回答显示了如何使用 Noda Time 测试 DST 是否有效。获得结果后,您可以相应地从 TimeZoneNames 中选择标准字符串或日光字符串。

至于通用名称,通常在人类指代时区时使用,而不是指白天时间部分或标准时间部分。一个用例是在时区选择中,例如此处所示。

于 2016-09-21T22:25:46.947 回答