BLOGTIMES
2014/06/07

date コマンドで iso8601 を扱う

  cli  sh 
このエントリーをはてなブックマークに追加

Linux の date コマンドは --iso-8601=seconds というオプションをつけると ISO 8601 形式で日付の出力ができますが、この形式を -d オプションに入力するとエラーになるという変な挙動を見つけてしまったのでメモ。

自分が出力できる ISO 8601 形式を自分でパースできないというのはとても滑稽なのですが、date: invalid date といわれてしまうので仕方ありません。ちなみにタイムゾーンを外したり、日付と時刻の区切りの "T" を削除したりと、ちょっと日付をいじってやるとちゃんとパース可能になるという謎仕様。ちなみに CentOS 6/ SL 6 の coreutils (date は coreutils に含まれています)*1*2バージョンは 8.4 でした。

$ date -d "2014-06-06T16:21:42Z" --iso-8601=seconds date: invalid date `2014-06-06T16:21:42Z' $ date -d "2014-06-06 16:21:42Z" --iso-8601=seconds 2014-06-07T01:21:42+0900 $ date -d "2014-06-06T16:21:42" --iso-8601=seconds 2014-06-06T18:21:42+0900 $ date --version date (GNU coreutils) 8.4 Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. 作者 David MacKenzie.

さすがにちょっとこの挙動は・・・と思ったのですが、もう少し調べてみると 8.13 (2011-09-08) からはさすがに直っているみたいです。

coreutils.git - GNU coreutils

date now accepts ISO 8601 date-time strings with "T" as the separator. It has long parsed dates like "2004-02-29 16:21:42" with a space between the date and time strings. Now it also parses "2004-02-29T16:21:42" and fractional-second and time-zone-annotated variants like "2004-02-29T16:21:42.333-07:00"

仕方が無いので sed で T を置換するという関数を作ってしのぐことにしようと思います。

date_conv(){ date -d "`echo $1 | sed 's/T/ /'`" --iso-8601=seconds ; }

いちおう僕の意図通りには動きました。

$ date_conv "2014-06-6T16:21:42Z" 2014-06-07T01:21:42+0900

トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6773
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン