2011-09-16 10 views
5

私はSuse 10でmktime(struct tm *)関数を使用しています。Linuxでのmktimeの動作が混乱していますか?

今、私は夏時間が有効になっているときに奇妙な動作に気付いています。 9月15日18時10分に夏時間を開始し、夏時間補正を30分行うとします。今、私が9月15日18:10の日付を持つtm構造体をmktimeと呼び、tm_isdstが0に設定されている場合、tm_isdstが1に設定されたtm構造体で同じ値が返されます。

しかし、 9月15日18時10分、tm_isdstが1に設定されている日付を渡すと、時刻は17:40に変更されています。 tm構造のこの修正は、9月15日18:10から9月15日18:40の間に渡された時間に注目されますが、その後は修正が行われず、dstフラグは有効のままです。 9月16日18時10分に日付を渡しても、時刻修正は行われません.dstフラグは有効なままです。

私は完全に混乱しています。これはmktimeの正しい動作ですか?

答えて

6

現地時間二回起こる現地時間の30分があります、その後、毎年一回DSTのための30分だけ変化、(一度DSTとは、一度なし)と、別の30分の場合こと決してが発生します(時間が変わるとスキップされます)。

したがって、クロックが戻ってから30分以内のローカルタイムはあいまいですが、DSTが有効かどうかを指定する必要はありません。実際に対応できる2つの実際の瞬間があります。

クロックが先に設定されてから30分以内の現地時間は無効です。それらが対応できる実際の瞬間はありません(ただし、DSTが有効であるか、または有効でないと仮定しても変換が行われる可能性があります)。

ローカルタイム(DST状態を無視する)では、複数の対応するUTC時刻が存在する可能性がありますが、任意のUTC時刻については、ローカルタイムは1つだけです(DST調整が適切に行われている場合)。

mktimeと電話をかけると、tm_isdstの値に応じて、DSTが有効かどうかのようにtime_tに渡すローカル時刻が変換されます。修正された値はこの変換の逆に基づいており、変換後の時刻にDSTが有効かどうかという考え方に応じて、DST時間を取得するかDST以外の時間を取得するかが決定されます。あなたが与えた時刻とあなたが戻った時刻は、同じ瞬間を表しますが、DSTの状態が異なるため、UTCとは異なるオフセットがあります。

はい、これはmktimeの正しい動作です。それはあなたがそれを与えた時間を正しく表現する方法の考え方に従って、構造内の値を正規化することになっています。

これはまた、実際のイベントのローカルタイムトラッキングを使用することに注意する必要がある理由を示しています。 - DSTステートまたはUTCからのオフセットが時間とともに保存されない場合、ローカルタイム値があいまいになることがあります。

+0

私は分かりません。おそらく、時刻が18:10(dst 0)をmktimeに渡すことは定義されていませんが、その場合に戻って最も役立つのは18:40(dst 1) –

0

this answerを確認してください。また、システムのタイムゾーンオフセットは何ですか?実行して確認してください:

date +%z 
+1

ご返信ありがとうございます。システムのタイムゾーンオフセットは+0830を返します。しかし、私の質問は、DSTが有効になっているときにのみ時刻修正が行われる理由です。例:9月15日18時10分にDSTが有効になるように設定されているため、問題はその時間から30分間発生します。しかし、9月16日18時10分に問題は発生しません。どうして? – Jay

関連する問題