旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

[Python][PHP] W3C-DTFやRFC822形式のdatetimeを変換

2009年11月20日

W3C-DTFとRFC822について

説明不要な気もしますが、一応↓
W3C-DTF(W3C Date Time Format)
RFC 822
どちらも、日時を文字列表記する際の規格を定めています。

例えば、W3C-DTF なら

1997-07-16T19:20:30.45+01:00

RSS 822 なら

Thu, 04 Oct 2007 23:59:45 +0000

と、このような表記で日時が記述されます。

Pythonでデコード

dateutil という非標準ライブラリを使用します。
http://labix.org/python-dateutil

このライブラリは非標準ではありますが、
Pythonクックブックにも紹介があるような、強力で由緒正しいものです。
ってか、これを使わないと、カレンダー的な処理は不便なので、
標準ライブラリにこだわりたい方でも、常に使うような感じで利用しても良いと思います。

このようにデコードします。

>>> from dateutil.parser import parse
>>> parse("2009-11-04T16:01:07.762876+09:00")
datetime.datetime(2009, 11, 4, 16, 1, 7, 762876, tzinfo=tzoffset(None, 32400))
>>> parse("2009-11-04 16:01:07.762876")
datetime.datetime(2009, 11, 4, 16, 1, 7, 762876)
>>> parse("Thu, 04 Oct 2007 23:59:45 +0000")
datetime.datetime(2007, 10, 4, 23, 59, 45, tzinfo=tzutc())

全く持って充分な機能です。

・・・が、一点だけ重箱の隅的に気になったのが

>>> parse("Thu, 04 Oct 2007 23:59:45 +0000")
datetime.datetime(2007, 10, 4, 23, 59, 45, tzinfo=tzutc())
>>> parse("Foo, 04 Oct 2007 23:59:45 +0000")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "dateutil/parser.py", line 697, in parse
return DEFAULTPARSER.parse(timestr, **kwargs)
File "dateutil/parser.py", line 303, in parse
raise ValueError, "unknown string format"
ValueError: unknown string format
>>> parse("Sun, 04 Oct 2007 23:59:45 +0000")
datetime.datetime(2007, 10, 4, 23, 59, 45, tzinfo=tzutc())

不正な曜日 “Foo” でエラーになってくれるのは流石として、
一方で、2007/10/4 は Thu の木曜が正しいのですが、
Sun で試してみても、デコードが通ります。

Pythonの datetime.date.weekday の仕様からすると、
日付から一意で曜日を取得できるはずなので、
Pythonの考え方と、余裕を持たせたdateutilの考え方の、この差は何だろう?と思いました。

PHPでデコード

strtotimeとdateの合わせ技で可能です、
同僚に聞いた話をまんまなんですけども。

<?php
$w3c_dtf_format = "2009-11-04T16:01:07.762876+09:00";
$datetime = date('Y-m-d H:i:s', strtotime($w3c_dtf_format));
var_dump($datetime); // -> "2009-11-04 16:01:07"
$rfc_822_format = "Thu, 4 Oct 2007 00:59:36 +0900";
$datetime = date('Y-m-d H:i:s', strtotime($rfc_822_format));
var_dump($datetime); // -> "2007-10-04 00:59:36"

※不正なパターンはあまり調査していませんが、適当に解析をしてしまうようです。

date_parse_from_formatという専用の関数もあるのですが、
こちらは PHP-5.3以降から使用可能なものなので、今は控えた方が良さそうです。
・・・ってか、要らなくね?この関数。