1

マウンテン タイム ゾーンとアリゾナ (どちらもマウンテン タイムであることはわかっています) を区別しようとしているときに、GetNamesForTimeZone("America/Phoenix", "en-us") が夏時間の名前を返すことがわかりました。

そのタイムゾーンの時間が夏時間であるかどうかを判断するために外部コード(noda time)に頼るべきですか、それともゾーンに夏時間がない場合に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ライブラリの作成者として、このようなことが起こる理由を説明できます。

まず、CLDRファイルのメタゾーンにAmerica/PhoenixマップしますAmerica_MountainmetaZones.xml

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

他のタイム ゾーンも同じメタ ゾーンにあります。

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

次に、英語用en.xmlファイルなどの各 CLDR 言語ファイルに、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 が実際にあったことを覚えておいてください。最後の 1967 年です。したがって、 Noda Timeで見られるような TZDB データがなければ、DST が特定の時点で有効かどうかを判断することはできません。

Jon's answerは、DST が Noda Time を使用して有効かどうかをテストする方法を示しています。結果が得られたら、それに応じて TimeZoneNames から標準文字列または夏時間文字列を選択できます。

一般名に関しては、通常、人間がタイム ゾーン全般を参照する場合に使用され、夏時間部分または標準時間部分のいずれも参照しません。この使用例の 1 つは、ここに示されているようなタイム ゾーンの選択です。

于 2016-09-21T22:25:46.947 に答える