9

tm構造体でのtm_isdstフラグの使用について次の疑問があります。マニュアルページとグーグルの結果によると、私はその値が次のように解釈されることを理解しています

A.値0は、DSTが表示された時間有効でないことを示します

B.値1は、DSTが有効であることを示します

C.値が-1の場合、mktimeはDSTが有効かどうかを確認します。

私を混乱させているのはこの3番目のポイントです。私の疑問は、mktimeがDSTを正確に適用する必要があるかどうかをどのように判断できるかということです。

例えば

My Time Zone = GMT + 3:00
DST shifting = +1 Hour at 5:00 AM in January (to keep it simple)
Current UTC time = "01/Jan/2012 00:00:00"
UTC time in seconds time_t timetUTC = X seconds
Hence my time is = "01/Jan/2012 03:00:00"

時間の経過とともに、私の時間値は次のように変化します

"01/Jan/2012 04:00:00"            (X + 1 * 60 * 60)
"01/Jan/2012 05:00:00"            (X + 2 * 60 * 60)
"01/Jan/2012 05:59:59"            (X + 2 * 60 * 60 + 59)
"01/Jan/2012 05:00:00"            (X + 3 * 60 * 60)
"01/Jan/2012 06:00:00"            (X + 4 * 60 * 60)

私の理解によると

tm tmMyTime = localtime_r(X + 2 * 60 * 60) will set tmMyTime.tm_isdst to 0
tm tmMyTime = localtime_r(X + 3 * 60 * 60) will set tmMyTime.tm_isdst to 1

このように、tm構造の他のすべてのコンポーネントがどちらの場合も等しい場合でも、mktime(tmMyTime)は、tm_isdst値に応じて適切なUTC値を返すことができます。

ここで、tmMyTime.tm_isdst = -1に設定すると、mktimeはどのような値を返しますか?TZ変数、時系列データベースなどについて読みました。それにもかかわらず、mktime()は、2回発生する可能性のあるtm値にDST補正を適用するかどうかを論理的にどのように判断できますか?

タイムゾーンにDSTがありません。したがって、私の理解が正しいかどうかはよくわかりません。私が間違っている場合は訂正してください。あなたの助けは大歓迎です。

4

3 に答える 3

6

つまり、実装に依存します。

mktimeは、ロケールをチェックすることでDSTルールを認識します。

1年の大部分について、mktimeは、DSTが特定の現地時間に適用されるかどうかを判断できます。問題は、実際、DSTが逆方向にシフトする「重複」時間です(この例では05:00:00-05:59:59)。このローカル時間範囲では、tm_isdst = -1の場合、mktimeはDSTが有効かどうかを知ることができません。これらのどれが選択されるかは、実装ごとに異なります。mktimeのGNUバージョンでは、シフト前のUTCが返されます。

于 2012-05-13T13:41:57.570 に答える
2

tm_isdst一般に、あいまいな時間を解決することはできません。これは、多くのタイムゾーンには、からdstにジャンプせずにnodst、オフセットとゾーンの省略形を変更するだけで、遷移(1回限り)があるためです。したがって、両方の時間(遷移の前後)は同じtm_isdstです。他のいくつかのゾーンはtm_isdst、夏/冬時間を切り替えると変更されますが、略語は変更されません(たとえば、オーストラリア/メルボルン)。

于 2013-12-19T11:26:36.973 に答える
1

プラットフォームに多少依存すると思います。Windowsでは、少なくともmktime()のドキュメントには、「Cランタイムライブラリは夏時間の計算を実装するための米国の規則を前提としている」と記載されているため、DSTがいつ開始されたかを判断できる規則の表がどこかにあります。任意の年に終了しました。

現在の場所にDSTがないのは幸運です。リアルタイムのデータ取得とプレゼンテーションである私の世界では、DSTは大きな迷惑です!

于 2012-05-10T18:37:25.750 に答える