[Python][PHP] W3C-DTFやRFC822形式のdatetimeを変換
2009年11月20日
W3C-DTFとRFC822について
説明不要な気もしますが、一応↓
W3C-DTF(W3C Date Time Format)
RFC 822
どちらも、日時を文字列表記する際の規格を定めています。
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
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以降から使用可能なものなので、今は控えた方が良さそうです。
・・・ってか、要らなくね?この関数。