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