proglog

主にプログラミングに関する断片的メモ

[devel][python] Pythonの日付変換の悪夢とfeedparser

feedparserは重いけど手軽。
でも、その日付変換でいつもはまるのでメモ。

  • 日付がpublished_parsedに入ってるはずと思っても、updated_parsedに入ってる
  • Python 9-tupleに変換された日付の扱い

後者について。
Pythonのタイムゾーン変換(UTC->JST)ではまった | mitc にあるようなUTCとかJSTのtimezoneinfoクラスがあるとする。
例えば、

<pubDate>Sun, 12 Aug 2012 22:51:37 +0900</pubDate>

が、
entries[i].updatedに入ってる。
で、entries[i].updated_parsedの中で、

(2012, 8, 12, 13, 51, 37, 6, 225, 0)

になる。
"UTC"に変換されてる。
これが、"Python 9-tuple"とか、"完全な 9 つの要素 全てに値の入ったタプル"とか書かれているものっぽい。
これを"isoフォーマット"で書き出したい。
そのまんま使って、

datetime.datetime.fromtimestamp(time.mktime(entry.updated_parsed)).isoformat()

とやると、

2012-08-12T13:51:37

となって、UTCそのまんまで、なおかつ、タイムゾーン情報が抜け落ちる。
で、二つの書き方。

datetime.datetime.fromtimestamp(time.mktime(entry.updated_parsed).replace(tzinfo=tz.UTC()).astimezone(tz.JST()).isoformat()
datetime.datetime.fromtimestamp(time.mktime(entry.updated_parsed) + 3600*9).replace(tzinfo=tz.JST()).isoformat()

出力は

2012-08-12T22:51:37+09:00

前者はタイムゾーン無しのdatetimeオブジェクトとを作っておいて、タイムゾーンUTCを追加、そしてJSTに変換。
後者は、実質的な数値をJSTに進めたナイーブなdatetimeオブジェクトを作って、あとからタイムゾーンを追加。
後者の方が若干短いか。