'at'は時間がいつ変わるのか、どうすればわかりますか?

'at'は時間がいつ変わるのか、どうすればわかりますか?

at昨日の夜明け2時40分ごろ、偶然、あちこち振り回っていました。 (質問しないでください。)イベントはすでにキューにありましたが、2時41分になると何も起こりませんでした。あきらめて寝てしまいました。

どうしたの?まあ - 今日、ノルウェーで夏時間が終わることがわかりました。したがって、今夜2時41分は2回発生します!もちろんです。第二一度(たとえば、夏の3時41分)、at予定されたイベントを開始します。

どのように動作しますか?スケジューラが時間の変化を認識し、指定された時間が経過したときにのみ実行するのではなく、2番目の時間を選択する理由と方法は何ですか?

ベストアンサー1

atmktime()指定した日付と時刻を解析し、夏時間を-1(使用できない、自動検出)に設定して実行してみてください。

atソースコード:

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

man 3 mktime:

tm_isdstフィールドで指定された値は、tm構造体に提供されている期間中に夏時間(DST)が適用されるかどうかをmktime()に通知します。正の値はDSTが適用されることを意味し、0は負の値が適用されないことを意味します。これは、mktime()が(タイムゾーン情報とシステムデータベースを使用して)指定された時間にDSTが適用されていることを確認しようとする必要があることを意味します。

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

したがって、mktime()DSTが有効であるかどうかについての決定が下され、2つの可能なオプションのうち後の日付を好むようです(その決定がどのように行われるかは文書では明確ではありません)。

atその後、UNIXタイムスタンプ(1970年1月1日以降の秒数)に変換されます。これがあれば、これ以上変更する時間はありません。時計を1時間ずつ前後に調整すると、時間に対する人間の表現のみが変更されたり、時間帯以降の秒数やジョブが実行される前の秒数は変更されません。


(テスト次元で)1分後にイベントを予約してみました。

ちなみにnext minute、時間が変わるかどうかにかかわらず、次の1分で実行される同様の式を使用できます。

おすすめ記事