いまさらdateの達人になる


気象のシミュレーションやデータ解析をしていると,日付の処理をすることが多い。シェルスクリプト,Tcl,Fortranなどで閏年や曜日を計算したり,日時を加算するプログラムを書いて使ってきた。練習問題としては良かったのかもしれないが,どうも車輪の再発明だったようだ。

dateコマンドを使えば,日付処理が楽になることを今更ながら知った。以下はBSD (FreeBSDやmacOS)の場合。

日付のフォーマットの文字解釈(パース)や変換ができる。

$ date -jf %Y%m%d%H%M%S 20160915120000
2016年 9月15日 木曜日 12時00分00秒 JST

オプションのjは時刻の設定をしないことを,fは次の文字列が入力フォーマットであることを示す。入力フォーマットについて詳しくはstrftimeのマニュアル参照。%Hまでしか必要ないからといって%M%Sを指定せず0000を入力しないと,現在の分秒が使われる。

$ date -jf %Y%m%d%H 2016091512
2016年 9月15日 木曜日 12時41分33秒 JST

UNIX時間は1970年1月1日00:00:00からの秒数である。出力フォーマットは+で指定される。

$ date -jf %Y%m%d%H%M%S 20160915120000 +%s
1473908400

日時を一度UNIX時間に変換すれば,加減算ができる。

$ t0=$(date -jf %Y%m%d%H%M%S 20160915120000 +%s)
$ dh=$(expr 6 \* 3600)
$ t=$(expr $t0 + $dh)
$ date -jf %s $t +%Y%m%d%H
2016091518

Linux

Linuxのdate-jfでなく-dを使い,書式の指定はできない。

$ date -d "2016-09-15 12:00:00+00" # Linux
$ date -d "2016-09-15 12:00:00+00" +%s # Linux
1473908400
$ t0=$(date -d "2016-09-15 12:00:00+00" +%s)
$ dh=$(expr 6 \* 3600)
$ t=$(expr $t0 + $dh)
$ TZ=0 date -d @$t +%Y%m%d%H
2016091518

スクリプトにまとめたもの:

2020-11-30編集

  • ``を$()に変更。
  • BSDのdateコマンドであることを記述。
  • BSD/Linux date,NCL,Pythonについてのgistを追加。