在尝试区分山地时区和亚利桑那州(我意识到它们都是山地时间)时,我发现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中选择标准字符串或日光字符串。
至于通用名称,通常是指一般的时区,而不是指夏令时部分或标准时间部分。其中一个用例是时区选择,如下所示。