日時
日時を取得する場合、date コマンドを使う。
POSIX の date コマンドでは演算機能がなく、現在時刻を表示、設定することしかできない。
date コマンドにはミリ秒の取得がない。
シェルスクリプトで頑張るよりも、C言語でまともな日時処理コマンドを作る方を推奨する。
ただし、汎用性はなくなる。(C言語コンパイラが必要だが載っていない環境がある。)
内部的にはUTC時刻を使うのが安全で、その場合、date に -u オプションを使う。
code:iso8601.sh
mydate=$(date +%Y%m%d)
mydateh=$(date +%Y-%m-%d)
mytime=$(date +%H%M%S)
mytimeh=$(date +%H:%M:%S)
mydatetime=$(date +%Y%m%dT%H%M%S)
mydatetimeh=$(date +%Y-%m-%dT%H:%M:%S)
表示形式
YYYY-MM-DD
code:date1.sh
$ date '+%Y-%m-%d'
2019-05-03
hh:mm:ss
code:date2.sh
$ date '+%T'
hhmmss
code:date.sh
$ date '+%H%M%S'
時間の計算方法
GNU date の場合は -d オプション
BSD date の場合は -v オプション
UNIX時間(秒の積算値)に変換すれば単純計算することができる。
UNIX時間への変換
標準的なものは存在しないので、awk で変換する。
GNU Coreutils の date コマンドであれば、以下でいわゆる UNIX時間(unixtime)で epoch からの秒数を取得することができる。
$ date +%s
パフォーマンスが問題であれば、C言語で書く。(コンパイルできる環境のみ)
カレンダーで計算するか、連続時間で計算するか?
UNIX時間の問題
1970年1月1日以降の秒数で数えているが、協定世界時(UTC)か国際原子時(TAI)かについての規定がない。
そもそも UNIX 時間を定義する時に UTC と TAI の違いなどの認識がまったくなかった。
閏秒の補正をどうするかについても何も規定がない。
systemd の日時表現
月初のみ、月末のみのような指定ができない。
時差を求める方法
date 2度叩きによる時間のズレを考慮しているのだが、最後に3回目の date を叩いてしまっているため、残念ながら正しくない。
2度で十分であること、また、秒がずれた場合には諦めてもう一度読み直すのが安全
現在時刻の時差しか取れない。
過去時刻の時差を得るには POSIX C を使うしかなさげ
参考
Keyword: 時間,日付,時刻,date,time