5

Suse 10 で mktime(struct tm*) 関数を使用しています。

現在、夏時間が有効になっていると、奇妙な動作が発生することに気付きました。たとえば、9 月 15 日の 18:10 に夏時間を有効にして、夏時間補正を 30 分間とします。ここで、日付が Sep 15 18:10 で tm_isdst が 0 に設定されている tm 構造体で mktime を呼び出すと、tm_isdst が 1 に設定されている場合にのみ、tm 構造体に同じ値が返されます。

しかし、tm_isdst を 1 に設定して日付を 9 月 15 日 18:10 として渡すと、時刻が 17:40 に変更されていることがわかります。tm 構造体でのこの修正は、9 月 15 日 18:10 から 9 月 15 日 18:40 までの経過時間で通知​​されますが、その後は時間の修正は行われず、dst フラグは有効のままです。9 月 16 日 18:10 として日付を渡しても、時刻の修正は行われず、dst フラグは有効のままです。

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

4

2 に答える 2

7

現地時間が DST で 30 分変わる場合、1 年に 1 回、2 回発生する 30 分間の現地時間があり (1 回は DST あり、1 回は DST なし)、別の 30 分間はまったく発生しません (時間が変更されるとスキップされます)。

したがって、DST が有効かどうかが指定されていない限り、クロックが戻されてから 30 分以内の現地時間はあいまいです。それらが対応できる実際の瞬間が 2 つあります。

時計が進んでから 30 分以内の現地時間は無効です。それらが対応できる実際の瞬間はありません (ただし、変換は、DST が有効である、または有効でないと想定することによって行われる可能性があります)。

したがって、一部の現地時間 (DST 状態を無視する) では、複数の対応する UTC 時間が存在する可能性がありますが、任意の特定の UTC 時間について、考えられる現地時間は 1 つだけです (DST 調整が適切に考慮されている場合)。

を呼び出すとmktime、 の値に応じて、DST が有効か無効かのように、指定した現地時間を time_t に変換しますtm_isdst。返される修正された値は、この変換の逆に基づいており、システムは、変換の時点で DST が有効であるかどうかの判断に基づいて、DST 時刻を取得するか、DST 以外の時刻を取得するかを決定します。与えた時間と戻ってきた時間は、実際には同じ瞬間を表していますが、DST の状態が異なるため、UTC からのオフセットが異なります。

はい、これは の正しい動作ですmktime。与えられた時間を適切に表現する方法のアイデアに従って、構造内の値を正規化することになっています。

これはまた、現地時間を使用して実際のイベントを追跡することに注意する必要がある理由も示しています。DST 状態または UTC からのオフセットが時間とともに保存されていない場合、一部の現地時間の値があいまいになる可能性があります。

于 2011-09-24T20:22:32.893 に答える
0

この回答をチェックして、それが役立つかどうかを確認してください。また、システムのタイムゾーンのオフセットは何ですか? 次を実行して確認します。

date +%z
于 2011-09-16T14:39:36.823 に答える