date

シェルスクリプトは、『シェルスクリプト (英語: shell script) は、オペレーティングシステムのシェルまたはコマンドラインインタプリタ向けに書かれたスクリプト言語である。』です。

dateコマンド

書式

date [オプション] [フォーマット]

オプション

-d フォーマット文字列で指定した時刻を表示します。
-IISO8601形式で日付と時刻を表示します。
-r ファイル指定したファイルの最終変更時刻を表示します。
-RRFC2822形式で日付と時刻を表示します。
-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改行
%pAM または PM の表示
%P%p の小文字表示
%r12時間表示での時刻
%R24時間表示での時刻
%sUTC (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 コマンド] | 雑廉堂の雑記帳

タイトルとURLをコピーしました