web-dev-qa-db-ja.com

「at」はどのようにして時間の変更があることを知っていますか?

たまたま昨日の午前2時40分にatをいじっていました。 (質問しないでください...)将来1分間(テストとして)イベントをスケジュールしてみましたが、実際には起こりませんでした。イベントは無事にキューに入れられましたが、何も起こらずに2時41分になるとそのまま残りました。私はあきらめて寝ました。

何が起こっていたのですか?さて、今日の夏時間はノルウェー(夏時間)で終わったので、実際に今夜2:41が2回発生しました。そして、確かにsecond one(つまり、夏時間から見た場合3:13)で、atがこれらのスケジュールされたイベントを開始しました。

これはどのように作動しますか?なぜ、どのようにしてスケジュールは時間の変化を認識し、時間が指定された時間を過ぎたときにそれを行うのではなく、2回目を選びますか?

12
leftaroundabout

atは、指定された日付と時刻の解析を試み、「夏時間」を-1に設定してmktime()を介して実行します(使用不可、自動検出)。

atソースコード:

_  tm1.tm_isdst = -1;
  t = mktime (&tm1);
_

_man 3 mktime_:

Tm_isdstフィールドで指定された値は、tmtime()に、tm構造体で提供された時間に対して夏時間(DST)が有効かどうかを通知します。正の値は、DSTが有効であることを意味します。ゼロは、DSTが無効であることを意味します。負の値は、mktime()が(タイムゾーン情報とシステムデータベースを使用して)指定された時刻にDSTが有効かどうかを判断する必要があることを意味します。

Mktime()関数は、tm構造体のフィールドを次のように変更します。[...] tm_isdstは(初期値に関係なく)正の値または0にそれぞれ設定され、DSTが有効か無効かを示します指定された時間。

したがって、mktime()は、DSTが有効か無効かを決定します。そして、2つの可能な選択肢から後の日付を好むようです(ただし、その決定がどのように行われるかはドキュメントからは明らかではありません)。

atは、それをUNIXタイムスタンプ(1970年1月1日からの秒数)に変換します。そして、それを手に入れたら、もはや時間の変化などはありません。時計を1時間前後に変更しても、人間の時間表現、つまり現在のタイムゾーンのみが変更されます。エポック以降の秒数や、タスクが実行されるまでの秒数は変更されません。


(テストとして)1分後にイベントをスケジュールしてみました

傍注では、_next minute_のような式を使用できます。これは、次の1分、時間の変更、またはいいえを実行します。

21
frostschutz