epoch秒とは
epoch秒は、1970年1月1日00:00:00 UTC(協定世界時)からの経過秒数である。UNIX時間とも呼ばれる。
シェルスクリプトで日時を数値として扱いたい場合、日時の差分を計算したい場合などに利用する。
現在時刻をepoch秒で取得する
dateコマンドに+%sを指定すると、現在時刻をepoch秒で取得できる。
$ date +%s
1783847533
epoch秒から日時文字列に変換する
date -dに@epoch秒を指定すると、epoch秒から日時文字列に変換できる。
$ date -d @1700000000
2023年 11月 15日 水曜日 07時13分20秒 JST
フォーマットを指定して出力する場合は+オプションを併用する。
$ date -d @1700000000 +'%Y-%m-%d %H:%M:%S'
2023-11-15 07:13:20
日時文字列からepoch秒に変換する
date -dに日時文字列を指定し、+%sで出力すると、日時文字列からepoch秒に変換できる。
$ date -d '2025-05-28 12:00:00' +%s
1748401200
シェルスクリプトで経過時間を計測する
処理の前後でepoch秒を取得し、差分を計算すると経過時間を計測できる。
#!/bin/bash
start=$(date +%s)
# 計測したい処理
sleep 2
end=$(date +%s)
elapsed=$((end - start))
echo "elapsed: ${elapsed} sec"
elapsed: 2 sec
バッチ処理やCIのステップごとの所要時間を記録する場合などに活用できる。
ミリ秒単位で計測する
秒単位では精度が足りない場合、%Nを組み合わせるとミリ秒単位で取得できる。
$ date +%s%3N
1783847528605
macOSでの注意点
date -dオプションはGNU coreutils版のdateコマンドに固有のオプションである。macOS標準のdateコマンド(BSD date)には存在しない。
BSD dateでepoch秒から日時文字列に変換するには-rオプションを使用する。
$ date -r 1700000000
2023年11月15日 水曜日 07時13分20秒 JST
日時文字列からepoch秒に変換するには-j -fオプションでフォーマットを指定する。
$ date -j -f "%Y-%m-%d %H:%M:%S" "2025-05-28 12:00:00" +%s
1748401200
GNU coreutils版と同じ書き方をしたい場合は、Homebrewでcoreutilsをインストールしgdateコマンドを使用する。
$ brew install coreutils
$ gdate -d @1700000000
$ gdate -d '2025-05-28 12:00:00' +%s
\第一線のプログラマーの行動原理を学べる!/
