全力で怠けたい

怠けるために全力を尽くしたいブログ。

date コマンドの自分的チートシート。

date コマンドの自分的チートシートをメモしておく。

date コマンドのバージョン。

$ date --version
date (GNU coreutils) 9.0
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David MacKenzie.

date コマンドのチートシート

MacGNU date を使う

macOS にインストールされている date コマンドは BSD 版のため、GNU date を使うためには自分でインストールする必要がある。 brewcoreutils をインストールすると楽。

$ brew install coreutils

brew でインストールした GNU のコマンドは g というプリフィックスが付いており、たとえば date コマンドなら gdate というコマンドになっている。 g を打つのが面倒くさいときは alias date='gdate' のようにエイリアスを付けるとよい。 ただ、 date のほかにも多数のコマンドがインストールされるので、個別にエイリアスを付けるのは少々面倒くさい。 そこで、GNU コマンドがインストールされたパスを優先して検索するように、シェルの設定ファイルなどで PATH 変数を設定してしまうのがよいと思う。

$ PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

オプションを指定せずに実行する

オプションを指定せずに実行すると現在日時をロケールに基づくフォーマットで表示する。

$ date
2022年  6月 14日 水曜日 20:03:48 JST

日時をロケールに基づくフォーマットで表示する

LC_TIME を指定して実行すると、現在日時を指定したロケールに基づくフォーマットで表示する。

$ date
2022年  6月 14日 水曜日 20:03:48 JST

$ LC_TIME=en_US date
Wed Jun 14 20:03:48 JST 2022

日時を任意のフォーマットで表示する

+FORMAT を指定して実行すると、現在日時を指定したフォーマットで表示する。 指定可能なフォーマットは man date にて確認できる。

$ date +'%Y/%m/%d %H:%M:%S (%z)'
2022/06/14 20:03:48 (+0900)

日時を ISO 8601 フォーマットで表示する

-I<精度>, --iso-8601=<精度> を指定すると、現在日時を ISO 8601 フォーマットで表示する。 +FORMAT で ISO 8601 フォーマットを指定しても同じことができるけど、こちらのほうがタイプ数が少なくて楽。

$ date -Idate
2022-06-14

$ date -Iseconds
2022-06-14T20:03:48+09:00

$ date -Ins
2022-06-14T20:03:48,000000000+09:00

日時を RFC 3339 フォーマットで表示する

--rfc-3339=<精度> を指定すると、現在日時を RFC 3339 フォーマットで表示する。 +FORMATRFC 3339 フォーマットを指定しても同じことができるけど、こちらのほうがタイプ数が少なくて楽。 精度は date, seconds または ns を指定できる。

$ date -f - --rfc-3339=date
2022-06-14

$ date --rfc-3339=seconds
2022-06-14 20:03:48+09:00

$ date --rfc-3339=ns
2022-06-14 20:03:48.000000000+09:00

任意のタイムゾーンでの日時を表示する

TZ=<タイムゾーン> を指定すると、指定したタイムゾーンでの現在日時を表示する。

$ TZ='Asia/Tokyo'
2022年  6月 14日 火曜日 20:03:48 JST

$ TZ=UTC date
2022年  6月 14日 火曜日 11:03:48 UTC

UTC での日時を表示する

-u, --utc または --universal を指定すると UTC での現在日時を表示する。 TZ=UTC を指定するのと同じことができるけど、こちらのほうがタイプ数が少なくて楽。

$ date -u
2022年  6月 14日 火曜日 11:03:48 UTC

指定した日時を表示する

-d, --date で日時を指定すると、指定した日時を表示する。

$ date -d '2022-02-28 01:23:45+09:00'
2022年  2月 28日 月曜日 01:23:45 JST

日時はかなり柔軟に指定でき、何日前、何ヶ月後といった日時も表示できる。

# 4日前
$ date -d '2022-02-28 01:23:45+09:00 4 days ago'
2022年  2月 24日 木曜日 01:23:45 JST

# 1ヶ月後
$ date -d '2022-02-28 01:23:45+09:00 next month'
2022年  3月 28日 月曜日 01:23:45 JST

ファイルから読み取った日時を表示する

-f, --file を指定するとファイルから読み取った日時を表示する。

$ cat date.txt
2022-02-28 01:23:45+09:00
2022-03-31 01:23:45+09:00

$ date -f date.txt
2022年  2月 28日 月曜日 01:23:45 JST
2022年  3月 31日 木曜日 01:23:45 JST

標準入力から読み取った日時を表示する

-f, --file にて - を指定すると標準入力から読み取った日時を表示する。

$ cat date.txt | date -f-
2022年  2月 28日 月曜日 01:23:45 JST
2022年  3月 31日 木曜日 01:23:45 JST

JST から UTC に変換する

$ date -Iseconds
2022-06-14T20:03:48+09:00

$ date -Iseconds | date -f- -u -Iseconds
2022-06-14T11:03:48+09:00

UTC から JST に変換する

$ date -u -Iseconds
2022-06-14T11:03:48+09:00

$ date -u -Iseconds | TZ='Asia/Tokyo' date -f- -u
2022-06-14T20:03:48+09:00

任意のタイムゾーンから別のタイムゾーンに変換する

# CST (中国標準時) は +08:00
$ TZ='Asia/Shanghai' date -Iseconds
2022-06-14T19:03:48+08:00

# AEST (オーストラリア東部標準時) は +10:00
$ TZ='Australia/Brisbane' date -Iseconds
2022-06-14T21:03:48+10:00

$ TZ='Asia/Shanghai' date -Iseconds | TZ='Australia/Brisbane' date -f- -Iseconds
2022-06-14T21:03:48+10:00

エポック秒を表示する

+%s を指定して実行すると エポック秒 を表示する。

$ date +'%s'
1655204628

$ date -Iseconds | date -f- +'%s'
1655204628

エポック秒を任意のフォーマットで表示する

$ echo '@1655204628' | date -f- -Iseconds
2022-06-14T20:03:48+09:00

$ echo '@1655204628' | date -f- +'%Y/%m/%d %H:%M:%S (%z)'
2022/06/14 20:03:48 (+0900)

月末日を表示する

月初日 (1日) に1ヶ月を足してから1日引くと月末日を求めることができる。

$ date -d '2022-02-01 1 months 1 days ago'
2022年  2月 28日 月曜日 00:00:00 JST

$ date -d '2022-03-01 1 months 1 days ago'
2022年  3月 31日 木曜日 00:00:00 JST

sed と組み合わせると入力された日付の月末日を簡単に求めることができる。

$ echo '2022-02-15' | sed -E 's/-[0-9]+$/-01 1 months 1days ago/' | date -f-
2022年  2月 28日 月曜日 00:00:00 JST

$ echo '2022-03-15' | sed -E 's/-[0-9]+$/-01 1 months 1days ago/' | date -f-
2022年  3月 31日 木曜日 00:00:00 JST