LoginSignup
15
6

More than 5 years have passed since last update.

dateコマンドで想像してた使い方が出来なかった話

Posted at

はじめに

「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"`

(あまりスマートに見えない)

もっといい方法があったのかなあ。。

15
6
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
6