Linux の date コマンドで今日/明日/昨日や月末や月初、翌月曜日などを求める方法を紹介します。
基本
今
引数を何も指定しないと「今」の時刻が出力されます。
$ date
2016年 7月 2日 土曜日 22:31:39 JST
基準日の指定
基準日は --date オプションで指定します。
$ date --date '2016-01-01'
2016年 1月 1日 金曜日 00:00:00 JST
日付の相対指定
例えば「 7 日前 」のような相対的な指定も可能です。
$ date --date '7 days ago'
2016年 6月 25日 土曜日 23:21:31 JST
基準日からの相対指定
次のように基準日と相対指定を組み合わせることが出来ます。
$ date --date '7 days ago 2016-07-07'
2016年 6月 30日 木曜日 00:00:00 JST
出力フォーマットを指定する
フォーマットの指定は「 +%Y-%m-%d 」のように「 + 」から始まるところがポイントです。
$ date '+%Y-%m-%d'
2016-07-02
日付指定の例
翌日
$ date '+%Y-%m-%d' --date '1 day'
2016-07-03
$ date '+%Y-%m-%d' --date '1 days'
2016-07-03
$ date '+%Y-%m-%d' --date 'tomorrow'
2016-07-03
前日
$ date '+%Y-%m-%d' --date '1 day ago'
2016-07-01
$ date '+%Y-%m-%d' --date '1 days ago'
2016-07-01
$ date '+%Y-%m-%d' --date 'yesterday'
2016-07-01
N 日後
日付には 0 や負数を指定することも出来ます。
$ date '+%Y-%m-%d' --date '3 days'
2016-07-05
$ date '+%Y-%m-%d' --date '2 days'
2016-07-04
$ date '+%Y-%m-%d' --date '1 days'
2016-07-03
$ date '+%Y-%m-%d' --date '0 days'
2016-07-02
$ date '+%Y-%m-%d' --date '-1 days'
2016-07-01
N 日前
$ date '+%Y-%m-%d' --date '3 days ago'
2016-06-29
$ date '+%Y-%m-%d' --date '2 days ago'
2016-06-30
$ date '+%Y-%m-%d' --date '1 days ago'
2016-07-01
$ date '+%Y-%m-%d' --date '0 days ago'
2016-07-02
$ date '+%Y-%m-%d' --date '-1 days ago'
2016-07-03
特定の日を基準とした翌日
基準日の指定と相対指定を組み合わせることで、特定の日を基準とした翌日を求めることが出来ます。
$ date '+%Y-%m-%d' --date '1 day 2016-07-01'
2016-07-02
$ date '+%Y-%m-%d' --date '1 days 2016-07-01'
2016-07-02
$ date '+%Y-%m-%d' --date 'tomorrow 2016-07-01'
2016-07-02
特定の日を基準とした前日
$ date '+%Y-%m-%d' --date '1 day ago 2016-07-01'
2016-06-30
$ date '+%Y-%m-%d' --date '1 days ago 2016-07-01'
2016-06-30
$ date '+%Y-%m-%d' --date 'yesterday 2016-07-01'
2016-06-30
月初(ある月の 1 日)
出力フォーマットを指定するときに、日付部分を「 01 」とします。
$ date '+%Y-%m-01' --date '-2 months'
2016-05-01
$ date '+%Y-%m-01' --date '-1 months'
2016-06-01
$ date '+%Y-%m-01'
2016-07-01
$ date '+%Y-%m-01' --date '1 months'
2016-08-01
$ date '+%Y-%m-01' --date '2 months'
2016-09-01
月末(ある月の最終日)
月末は「月初(ある月の 1 日)」の「 1 日前 」として求めます。
$ date '+%Y-%m-%d' --date "1 days ago $(date '+%Y-%m-01' --date '-2 months')"
2016-04-30
$ date '+%Y-%m-%d' --date "1 days ago $(date '+%Y-%m-01' --date '-1 months')"
2016-05-31
$ date '+%Y-%m-%d' --date "1 days ago $(date '+%Y-%m-01')"
2016-06-30
$ date '+%Y-%m-%d' --date "1 days ago $(date '+%Y-%m-01' --date '1 months')"
2016-07-31
$ date '+%Y-%m-%d' --date "1 days ago $(date '+%Y-%m-01' --date '2 months')"
2016-08-31
今週の N 曜日
$ date '+%Y-%m-%d' --date 'sunday'
2016-07-03
$ date '+%Y-%m-%d' --date 'monday'
2016-07-04
$ date '+%Y-%m-%d' --date 'tuesday'
2016-07-05
$ date '+%Y-%m-%d' --date 'wednesday'
2016-07-06
$ date '+%Y-%m-%d' --date 'thursday'
2016-07-07
$ date '+%Y-%m-%d' --date 'friday'
2016-07-08
$ date '+%Y-%m-%d' --date 'saturday'
2016-07-09
次の N 曜日
「今週の N 曜日」との違いは、今日が日曜日の場合に来週の日曜日の日付となる点です。
$ date '+%Y-%m-%d' --date 'next sunday'
2016-07-10
$ date '+%Y-%m-%d' --date 'next monday'
2016-07-04
$ date '+%Y-%m-%d' --date 'next tuesday'
2016-07-05
$ date '+%Y-%m-%d' --date 'next wednesday'
2016-07-06
$ date '+%Y-%m-%d' --date 'next thursday'
2016-07-07
$ date '+%Y-%m-%d' --date 'next friday'
2016-07-08
$ date '+%Y-%m-%d' --date 'next saturday'
2016-07-09
年末
$ date '+%Y-12-31'
2020-12-31
元旦
$ date '+%Y-01-01'
2020-01-01
次の元旦
$ date '+%Y-01-01' --date 'next year'
2021-01-01