【Mac/Linux】zsh dateコマンドで日付操作・フォーマットをする方法

zshにおけるdateコマンドについて,簡単にまとめています.

日付の取得

現在時刻

dateコマンドをそのまま使うと現在時刻が出力されます.


date

2022年 7月19日 火曜日 19時25分11秒 JST

出力されるフォーマットを変更

dateコマンドに以下のようなオプションをつけると出力フォーマットを変更できます.


date +%Y-%m-%d

2022-07-19

+以降の部分を変更すれば様々なフォーマットで出力することができます.
最後のコマンドは秒単位まで表示しています.


date +%Y/%m/%d
date +%y%m%d
date +%Y%m%d%H%M%S

2022/07/19
220719
20220719193756

月・日・曜日・時刻の取得

月だけを取得

月だけを取得するには以下のようなコマンドです.


date +%b
date +%B

7
7月
日付だけを取得

日付だけを取得するには以下のようなコマンドです.
なお,+%d+%-dに変更すると,日付が一桁の場合に前に0がつかなくなります.1


date +%d
date +%d日

21
21日

参考

21日のように出力するには+%dに「日」をくっつける方法しかなさそうです.
もしコマンドで指定できる方法をご存知の方がいればお知らせください...

曜日だけを取得

曜日名だけを取得するには以下のようなコマンドです.


date +%a
date +%A

水
水曜日
曜日を数値で取得
  • +%u: 曜日を1〜7で表し,1が月曜日です.
  • +%w: 曜日を0〜6で表し,0が日曜日です.

以下の例はコマンドの実行日が水曜日なので両方3になっています.


date +%u
date +%w

3
3
時刻だけを取得

時刻だけを取得するには以下のようなコマンドです.


date +%H:%M:%S

14:42:54

任意の日時を指定してフォーマット

現在時刻ではなく任意の日時を指定するには以下のコマンドです.


date -j -f %Y-%m-%d 2022-01-01 +%Y%m%d

20220101

-jオプションで任意の日時を受け取るようにし,-fオプションで日時のフォーマットを指定しています. %Y-%m-%dは入力日時のフォーマット2022-01-01は入力日時+%Y%m%dは出力フォーマットです.

シェルスクリプトで日時引数をフォーマット化,変数に代入する際などに使えます.

具体例はこちらをクリックしてください

内容が以下のようなdate_sample.shを作成します.


#!/bin/zsh

f_date=`date -j -f %Y-%m-%d "$1" +%Y%m%d`
echo フォーマット前:$1
echo フォーマット後:$f_date

上記のシェルスクリプトについて,日時引数をつけて実行すると以下のようになります.


./date_sample.sh 2022-01-01
フォーマット前:2022-01-01
フォーマット後:20220101

引数に取った日時をシェルスクリプト内のdateコマンドに渡してフォーマットを変換,変数に代入しています.

過去の日時を指定

日付の指定をする際は-vオプションを使用して操作します.
bashのコマンドとはかなり異なるため,注意が必要です.

指定できる期間の種類

指定可能な種類は以下のとおりです.
現在日時から「2週間前」「5時間前」などの指定ができます.

  • y 年
  • m 月
  • w 週
  • d 日
  • H 時間
  • M 分
  • S 秒

X日・Xヶ月・X年前

-vオプションのあとに期間を指定します.
以下のようにすれば(現在日時から)-7daysとなります.2


date -v -7d
date -v -7d +%Y-%m-%d

2022年 7月13日 水曜日 23時06分53秒 JST
2022-07-13

「Xヶ月・X年前」を指定するには以下のとおりです.
それぞれ上から「6ヶ月前・3年前」となっています.


date -v -6m
date -v -3y

2022年 1月20日 木曜日 23時11分47秒 JST
2019年 7月20日 土曜日 23時11分59秒 JST

X年X日前の指定

上記で確認した期間指定は組み合わせることも可能です.
以下は「1年と3日前」という指定です.


date -v -1y -v -3d

2021年 7月19日 月曜日 23時16分28秒 JST

注意

複数の単位で期間を指定する場合はそれぞれに-vオプションが必要です.

未来の日時を指定

過去の日時を指定する場合と同様に-vオプションのあとに期間を指定します.
以下のようにすれば(現在日時から)+5daysとなります.


date -v +5d

2022年 7月25日 月曜日 23時24分18秒 JST

参考

その他の日時操作も過去の日時指定で使用した-+に変えれば未来の日時指定になります.

未来の任意の日時を指定

あまり使い道がわかりません3が,以下のような指定もできます.


date -v 2045y -v 7m -v 20d

2045年 7月20日 木曜日 23時40分04秒 JST

未来の日時を-vオプションを使って指定しています.
なお,date -v 2045y -v julm -v 20dでも同様の結果が得られます.4

ひとこと

シェルスクリプトで日付の操作をすることが多いので,他にも気になった使い方などがあれば追記したいと思います.


  1. 例えば現在日時が2022/07/01の場合,date +%dを実行すると01と出力されます.一方でdate +%-dを実行すると1となります. 

  2. 以下のコマンドを実行した日が2022/7/20なので,7日前の2022/7/13が出力されています. なお,2つ目のコマンドは出力フォーマット指定を組み合わせたものです. 

  3. 未来の日付の曜日を知りたい(date -v 2045y -v 7m -v 20d +%a),未来の基準日を指定するなど...? 

  4. 月の指定をJulyの略記に置き換えています(July + month).通常は数値で指定する方がわかりやすいと思いますが...