月が相対日付で終わると、atはどのように機能しますか?

月が相対日付で終わると、atはどのように機能しますか?

1月31日に使用するとどのような性能を発揮しますかat midnight next month? 3月4日ですか、それとも2月28日ですか?それとも3月31日ですか?

ベストアンサー1

この回答の目的は、既に受け取った他の(正しい)回答を補完し、いくつかの追加の技術情報を提供することです。

atコマンドがコマンドを受信したときNEXT <inc_dec_period>1、現在の日付を時間構造として使用する(struct tm2指定した期間に「1」を追加します。

したがって、atコマンドが実行されるとNEXT MONTH、現在の日付を使用して3月に「1」を追加して、0(1月)が1(2月)になり、1が2(3月)になるようになります。これはdate -d 'now + 1 month'コマンドと同じです。

今重要な部分は次のdateとおりです。atその後、コマンドは、操作後に生成された新しい時間構造を取得し、mktime(3)新しい絶対時間4を返すライブラリ呼び出しの引数として使用します。mktime(3)文書には次のように記載されています。

このmktime()機能が修正されました。Tm値2構造は次のとおりです。 [...]構造メンバーが有効範囲外になると正規化されます(たとえば、10月40日が11月9日に変更されます)。);

たとえば、次のようになります。

  • 現在の日付が2023-08-31の場合、
  • コマンドはnext month
  • 新しい時間構造は2023年9月31日です。

31は9月の有効な間隔を超えているため、文書に記載されているように2023年10月1日に正規化されます。

$ date -d '2023-08-31 + 1 month' --rfc-3339=date
2023-10-01

現在の日付が2023-01-31の場合、同じコマンドの結果atは時間構造2023-02-31であり、これは2023-03-03に正規化されます。

$ date -d '2023-01-31 + 1 month' --rfc-3339=date
2023-03-03
$ date -d '2024-01-31 + 1 month' --rfc-3339=date # leap year
2024-03-02

1か所inc_dec_period次のいずれかです。

MINUTE | HOUR | DAY | WEEK | MONTH | YEAR

2tm構造には、少なくとも次のメンバーが含まれます。

int    tm_sec   seconds [0,61]
int    tm_min   minutes [0,59]
int    tm_hour  hour [0,23]
int    tm_mday  day of month [1,31]
int    tm_mon   month of year [0,11]
int    tm_year  years since 1900
int    tm_wday  day of week [0,6] (Sunday = 0)
int    tm_yday  day of year [0,365]
int    tm_isdst daylight savings flag

3月の結果が11より大きい場合、年フィールドも1ずつ増加します。

4カレンダー時間を表すデータ型を返しますmktimetime_t絶対時間値として解釈した場合、epoch 1970-01-01 00:00:00 +0000(UTC)から経過した秒数を示します。

おすすめ記事