TimeZoneNames标准,日光,通用用途

时间:2016-09-21 15:29:26

标签: .net timezone nodatime iana

在尝试区分山区时区和亚利桑那州时(我发现它们都是山区时间)我发现GetNamesForTimeZone(" America / Phoenix"," en-us")返回了一个白天的名字。

我应该依靠外部代码(noda时间)来确定该时区的时间是否为白天,或者如果某个区域没有夏令时,是否可以通过TimeZoneNames函数知道?

在同样的说明中,使用" generic"的用例是什么?时区名称的名称而不是标准vs日光?

2 个答案:

答案 0 :(得分: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 ...

答案 1 :(得分:1)

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

首先,America/Phoenix映射到the CLDR metaZones.xml file

中的America_Mountain元区域
<timezone type="America/Phoenix">
    <usesMetazone mzone="America_Mountain"/>
</timezone>

其他时区也位于同一元区:

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

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

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

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

对于通用名称,通常在人类通常指时区时使用,而不是指向日光时间部分或标准时间部分。一个用例是在时区选择中,例如演示here