dateコマンド
書式
date [オプション] [フォーマット]
オプション
-d フォーマット | 文字列で指定した時刻を表示します。 |
-I | ISO8601形式で日付と時刻を表示します。 |
-r ファイル | 指定したファイルの最終変更時刻を表示します。 |
-R | RFC2822形式で日付と時刻を表示します。 |
-s フォーマット | フォーマットで指定した時間に設定します。 |
-u | 標準時を表示、設定します。 |
+フォーマット | 後述するフォーマットで日時を出力します。 |
フォーマット
%a | 曜日の省略名 (Sun、日) |
%A | 曜日名 (Sunday、日曜日) |
%b | 月の省略名 (Jan) |
%B | 月名 (January) |
%c | 日付と時刻 |
%C | 世紀 |
%d | 日 |
%D | 日付(mm/dd/yy) |
%F | 日付(%Y-%m-%d) |
%H | 時 (24時間形式、00〜23) |
%I | 時 (12時間形式、01〜12) |
%j | 年の開始日からの日数 (001〜366) |
%m | 月 (01〜12) |
%M | 分 (00〜59) |
%N | ナノ秒(000000000..999999999) |
%n | 改行 |
%p | AM または PM の表示 |
%P | %p の小文字表示 |
%r | 12時間表示での時刻 |
%R | 24時間表示での時刻 |
%s | UTC (1970-01-01 00:00:00) からの秒数 |
%S | 秒 (00〜60) |
%t | 水平タブ |
%T | 時刻 |
%u | 曜日(1〜7、1が月曜日) |
%w | 曜日(0〜6、0が日曜日) |
%x | 日付 |
%X | 時刻 |
%y | 西暦(00〜99) |
%Y | 西暦 |
日付文字列から
-d
オプションを使用することで、日付を表す文字列から日時を表示します。
50年前の今日は?
$ date -d "50 years ago"
Tue 09 Nov 1971 09:47:18 AM JST
2020年2月の月末は?
$ date -d "2020/2/1 + 1 month - 1 day"
Sat 29 Feb 2020 12:00:00 AM JST
ロサンゼルス時間で、来週月曜日の午前10時は、こちらでは何時?
$ date -d 'TZ="America/Los_Angeles" 10:00 next Monday'
Tue 16 Nov 2021 03:00:00 AM JST
エポック時間から時刻を表示。
$ date -d '@1636421472'
Tue 09 Nov 2021 10:31:12 AM JST
気になるあの人の誕生日は何曜日?
$ date -d '1969/8/31'
Sun Aug 31 00:00:00 JST 1969
date コマンドで経過時間を求める
シェルスクリプト中で、処理にかかった時間を求めたい場合があります。
そんなときどうすればよいのか調べてみました。
date コマンドでミリ秒単位で時間を計測する例
まず回りくどい説明は一旦省いて、以下がその例になります。
#!/bin/bash
# 現在時刻を取得
_started_at=$(date +'%s.%3N')
# 何らかの処理
sleep 3
# 完了時刻を取得
_ended_at=$(date +'%s.%3N')
# 経過時間を計算
_elapsed=$(echo "scale=3; $_ended_at - $_started_at" | bc)
echo "start: $(date -d "@${_started_at}" +'%Y-%m-%d %H:%M:%S.%3N (%:z)')"
echo "end : $(date -d "@${_ended_at}" +'%Y-%m-%d %H:%M:%S.%3N (%:z)')"
echo "dur: $_elapsed"
eval "echo Elapsed Time: $(date -ud "@$_elapsed" +'$((%s/3600/24)):%H:%M:%S.%3N')"
ちなみにこのスクリプトを実行した結果は以下の通りとなります。
start: 2022-01-12 21:34:36.266 (+09:00)
end : 2022-01-12 21:34:39.273 (+09:00)
dur: 3.007
Elapsed Time: 0:00:00:03.007
以降、この例の説明をします。
date コマンドでミリ秒単位で時間を計測する方法
まず以下の例ですが、エポックタイムとナノ秒単位で現在時刻を出力させてみた例です。
date +'%s.%N'
1641896590.718841034
この例では、書式 %N
を使うことで、ナノ秒単位で表示させています。ナノ秒とは、0.000000001
秒のことですね。
ミリ秒の場合は、書式を 0.001
秒単位まで切り詰めないといけません。
そんなときは、書式文字の %
の N
の間に、3
と入れることで、有効桁数を指定することができます。
つまり、以下のようにします。
$ date +"%s.%3N"
1641896999.468
書式をタイムスタンプ風に表示するには、次のようにします。
$ date +'%H:%M:%S.%3N'
09:28:09.689
これを用いて、スクリプトの処理の開始前と終了後、それぞれで次のようにしてエポックタイムとミリ秒単位の数値を取得します。
# 処理の開始
_started_at=$(date +'%s.%3N')
# 何らかの処理
# 処理の終了
_ended_at=$(date +'%s.%3N')
そして、その経過時間を算出し、変数に代入します。
# 経過時間を計算
_elapsed=$(echo "scale=3; $_ended_at - $_started_at" | bc)
参考
Linuxコマンド【 date 】システムの日付や時刻の表示・設定する - Linux入門 - Webkaru
dateコマンドは、アクティブなジョブをリスト表示するコマンドです。
シェルスクリプト中で時間をミリ秒単位で計測 – [date コマンド] | 雑廉堂の雑記帳