CPAN DateTime::Formatまとめメモ

こないだ MechanizedSeleniumでtwitterからnowaに投稿 を作ったときにメモったままそのままにしてたのを投稿。

perlだと DateTime::Format::* を使って

my $str = "Tue, 01 May 2007 03:08:27 +0000";
my $dt = DateTime::Format::HTTP->parse_datetime($str);
$dt->>epoch;

で全部解決だけど日付フォーマットの名前がわからないとどのモジュールを使えばいいのかわからない。というわけでメモ。
DateTime::Format::HTTPのドキュメントにいくつかのフォーマットとその名前がリストされていてわかりやすかったです。

ISO8601
2006-11-22T18:37:34+0000こんなやつ。XMLRPCで日付を渡すときに使います。
MySQLとか使われている 1994-02-03 14:15:29 のようなフォーマットも実はISO8601でびっくり。 DateTime::Format::ISO8601
W3CDTF
2007-03-02T13:58:42.263+09:00こんなやつ。みためISO8601と変わりませんが 日付の表記に関するノート によれば

ISO8601は
この標準はかなり多くのバリエーションを定義している上、西暦年の上2桁の省略を認めているため、あまり使い勝手が良くありません。そこで、IS0 8601のサブセットとして、日時の表記方法を限定し、よりシンプルにしたものがW3Cからノート[W3CDTF]として公開されました。DateTime::Format::W3CDTF

だそうです。atomの日付表示はこれになっています。

RFC2822/822
Mon, 23 Apr 2007 11:10:53 +0900メールのヘッダ、HTTPのレスポンスヘッダで使われている形式です。DateTime::Format::HTTPDateTime::Format::Mailふたつあります。ドキュメントを見るかんじHTTPのほうがパースしてくれるフォーマットが多そうです。
ctime
Thu Feb 3 17:03:55 GMT 1994こんなやつ。曜日、月の名前と並んでいるところが特徴的です。tiwtterのuser_timeline.xmlがこれでした。timezone部分が3文字のタイムゾーンコードで書いてあればDateTime::Format::HTTPでパースできるのですが、+0000のように時差が書いてある場合パースできません…

ちなみに DateTime::Formart::* モジュールの一覧は Modules – Perl DateTime Wiki にあるので、へんなフォーマットの日付をパースしたいときにはみてみるといいかもしれません。


About this entry