python-powered

RFC2822表記をdatetimeに変換するには

Email や RSS2.0 などで使われている
‘Sun, 16 Jun 2013 14:05:15 +0000′
といった表記を python で扱うときにちょっと悩んだ。

大きな流れとしては、
– time.struct_time型に変換
– timestampに変換
– datetimeに変換

1. time.struct_time型に変換

>>> from email.utils import parsedate
>>> parsedate('Sun, 16 Jun 2013 14:05:15 +0000')
(2013, 6, 16, 14, 5, 15, 0, 1, -1)

2. timestampに変換
struct_time型は、time.mktime() の引数にできるので、前述の戻り値を渡す。

>>> from email.utils import parsedate
>>> from time import mktime
>>> timestamp = mktime(parsedate('Sun, 16 Jun 2013 14:05:15 +0000'))

3. datetimeに変換
timestamp を fromtimestamp() に渡す。

>>> import datetime
>>> datetime.datetime.fromtimestamp(timestamp)
datetime.datetime(2013, 6, 16, 14, 5, 15)

Google App Engineのデータストアに格納する際に、
時刻フィールドを「DateTimeProperty」にしたかったので、
このような処理を施した。

実は、手順1. で parsedate()を使っているのは、
タイムゾーン表記「+0000」部分を無視している。
parsedate_tz() を使うと、タイムゾーンも取り込めるのだけど、
そのままでは、mktimeに渡せない。
うまくdatetimeに変換できる方法があれば、教えてもらいたい。m(_ _)m


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>