はじめに
「dateコマンドを使って変な日付フォーマットをどうにかしたい!」
「日付が読み込めない。。。」
とかそういう人がこの記事にたどり着いたら、
できないのか。。。と時間を無駄にせず他の作業に移れるように記事を書きました。
あとは実はもっといいやり方あったのかなーという思いから。
やりたかったこと
シェルスクリプトで、
『あるところから取得してきたタイムスタンプと現在時刻を比較して~ウンヌンカンヌン』
ということをしたかった。
ならdateコマンドを使おう。となりました。
dateコマンドって?
dateコマンドは現在時刻を取得するコマンドです。
現在時刻取得
$ date
2016年 6月 6日 月曜日 18:14:40 JST
date -d "2016/06/06 19:36:59"と入力すれば
$ date -d "2016/06/06 19:36:59"
2016年 6月 6日 月曜日 19:36:59 JST
と出力してくれます。
フォーマットが気に入らなければ、
$ date -d "2016/06/06 19:36:59" "+%Y-%m-%d %H:%M:%S"
2016-06-06 19:36:59
1970-01-01 00:00:00 UTC からの秒数で表示
$ date -d "2016/06/06 19:36:59" "+%s"
1465209419
↑時間の比較に使える!
ほかにもいろいろ。
でも思った使い方が出来なかった!
はじめにも書いた
『あるところから取得してきたタイムスタンプと現在時刻を比較して~ウンヌンカンヌン』
という処理をしようとしていたら、
あるところから取得してきたタイムスタンプが、、
20160606_193659
こんな形だったのだ。。。
でもこれだと無効といわれてしまう。
$ date -d "20160606_193659"
date: `20160606_193659' は無効な日付です
-dオプションは一般的に読み取れる型でないと読み込んでくれないという。
(一般的って。。。?)
フォーマットオプションも
-d "有効な日付"を好きなフォーマットにできるが、
好きなフォーマットを読み込んではくれない。
$ date -d "2016/06/06 19:36:59" "+%Y%m%d_%H%M%S"
20160606_193659
どうにか、
・前から4文字はYYYY
・その次の2文字はmm
・ :
みたいに指定して自動で解釈してとかそんな機能、実はありそうだなーと思ったのですが
そんなものはなかった・・・。
仕方がなく、
20160606_193659をいったんsedで変換して
2016/06/06 19:36:59にしてからdateに読み込ませました。
変換もめんどくさい!
echo "20160606_193659" | sed -e "s/^\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)_\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1\/\2\/\3 \4:\5:\6/g"`
(あまりスマートに見えない)
もっといい方法があったのかなあ。。