TimeZoneNames 标准、日光、通用用途
TimeZoneNames standard, daylight, generic uses
在尝试区分山地时区和亚利桑那州(我意识到它们都是山地时间)时,我发现 GetNamesForTimeZone("America/Phoenix", "en-us") 返回了夏令时名称。
我应该依靠外部代码(noda 时间)来确定该时区的时间是否是夏令时,或者如果一个区域没有夏令时,是否有办法仅通过 TimeZoneNames 函数知道?
同样,使用 "generic" 名称作为时区名称而不是标准名称与夏令时名称的用例是什么?
据我所知,TimeZoneNames 只是时区名称本身——它对时区数据本身一无所知。
如果你想知道America/Phoenix目前是否正在观察夏令时,我肯定会使用野田时间本身:
// 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
映射到 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 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 中没有关于夏令时是否适用于亚利桑那州的信息。请记住,亚利桑那州过去确实有夏令时 - last in 1967. So without TZDB data like that you would find in Noda Time,您无法确定夏令时是否在某个特定时间点有效。
展示了如何使用 Noda Time 测试夏令时是否有效。获得结果后,您可以相应地从 TimeZoneNames 中选择标准或夏令时字符串。
至于通用名称,通常在人们泛指时区而不是夏令时部分或标准时间部分时使用。一个用例是时区选择,如 here.
所示
在尝试区分山地时区和亚利桑那州(我意识到它们都是山地时间)时,我发现 GetNamesForTimeZone("America/Phoenix", "en-us") 返回了夏令时名称。
我应该依靠外部代码(noda 时间)来确定该时区的时间是否是夏令时,或者如果一个区域没有夏令时,是否有办法仅通过 TimeZoneNames 函数知道?
同样,使用 "generic" 名称作为时区名称而不是标准名称与夏令时名称的用例是什么?
据我所知,TimeZoneNames 只是时区名称本身——它对时区数据本身一无所知。
如果你想知道America/Phoenix目前是否正在观察夏令时,我肯定会使用野田时间本身:
// 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
映射到 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 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 中没有关于夏令时是否适用于亚利桑那州的信息。请记住,亚利桑那州过去确实有夏令时 - last in 1967. So without TZDB data like that you would find in Noda Time,您无法确定夏令时是否在某个特定时间点有效。
至于通用名称,通常在人们泛指时区而不是夏令时部分或标准时间部分时使用。一个用例是时区选择,如 here.
所示