datetimeを別のタイムゾーンに変更する
UTCの文字列をdatetimeに変換し、JSTに変える
例えば「2013-12-31T23:55:58Z」という、ISO 8061拡張表記の文字列をJSTに変換してみる。
やりたいことを図示すると、こうなる。
※時分秒の後ろに"Z"と付けるとUTCらしい(以下引用)
ISO 8601 - Wikipedia
タイムゾーン指定子
協定世界時(UTC)
時刻の後ろに Z を添えることで協定世界時(UTC)での時刻をそのまま示すことができる。
例:
2004-04-01T12:00Z (20040401T1200Z)2004年04月01日12時00分(正午)(UTC)
文字列->datetime
python-dateutilを使うとISO8061の文字列を簡単にパースできるので実際にやってみる。
>>> from dateutil.parser import parse >>> x = parse("2013-12-31T23:55:58Z") >>> x datetime.datetime(2013, 12, 31, 23, 55, 58, tzinfo=tzutc()) >>> x.isoformat() '2013-12-31T23:55:58+00:00'
datetimeのastimezoneを使ってJSTに変換
タイムゾーンを変えるときはpytzのastimezoneを使う。
さっきの処理にこのように続けてみる。
>>> import pytz >>> JST = pytz.timezone("Japan") >>> y = x.astimezone(JST) >>> y datetime.datetime(2014, 1, 1, 8, 55, 58, tzinfo=<DstTzInfo 'Japan' JST+9:00:00 STD>) >>> y.isoformat() '2014-01-01T08:55:58+09:00'
astimezoneはaware-datetimeからしか呼べないので注意。
このように、naive-datetimeから呼ぶとエラーになる。
>>> now = datetime.now() >>> now.astimezone(JST) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: astimezone() cannot be applied to a naive datetime
時差が入っている文字列をJSTに変換
>>> z = parse("2013-12-31T23:55:48+0900") >>> z datetime.datetime(2013, 12, 31, 23, 55, 48, tzinfo=tzoffset(None, 32400)) >>> z.astimezone(JST) datetime.datetime(2013, 12, 31, 23, 55, 48, tzinfo=<DstTzInfo 'Japan' JST+9:00:00 STD>) >>> z == z.astimezone(JST) True
サマータイムを考慮するときはnormalize
>>> NY = pytz.timezone("America/New_York") >>> NY.normalize(NY.localize(datetime(2014, 3, 9, 2, 1, 0))) datetime.datetime(2014, 3, 9, 3, 1, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>) >>> NY.normalize(NY.localize(datetime(2014, 3, 9, 2, 1, 0))).dst() datetime.timedelta(0, 3600)