2014年05月10日

datetime.replace の罠

datetime にタイムゾーンを指定する方法に、replace という関数がある。

単にタイムゾーンオブジェクト tz を datetime オブジェクト dt に追加したいだけで、日付や時刻データメンバへの調整を行わないのなら、 dt.replace(tzinfo=tz) を使ってください。

8.1. datetime − 基本的な日付型および時間型

実際にやってみる。

>>> import datetime, pytz
>>> dt = datetime.datetime(2014, 5, 10)
>>> jst = pytz.timezone('Asia/Tokyo')
>>> print dt.replace(tzinfo=jst)
2014-05-10 00:00:00+09:00

普通に使える。

ところが、一歩日本を出ると変なことが起きる(ことがある)。 たとえば中国だ。

>>> cst = pytz.timezone('Asia/Shanghai')
>>> print dt.replace(tzinfo=cst)
2014-05-10 00:00:00+08:06

8時間と6分ずれたタイムゾーン? そんなわけはない。 わけはないのだが、replace を使うとこうなってしまうのだ。

解決策はタイムゾーン側から変換させること。

>>> print cst.localize(dt)
2014-05-10 00:00:00+08:00
>>> print jst.localize(dt)
2014-05-10 00:00:00+09:00

ちなみに6分ずれた上海のデータの出処が気になる人は IANA Time Zone Database のデータ tzdata2014b.tar.gz を展開して asia というファイルを読むと良い(随時更新されるので2014bの部分は適当に読み換えること)。 簡単に言うと古い、グリニッジに合わせる前の地方標準時が持っていた、ずれのデータだ。

ラベル:Python
posted by mft at 00:00| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする