ハバナ式継続的デリバリー

Python, Ubuntu, JavaScript 色々知らなかった!のメモ

datetimeを別のタイムゾーンに変更する

UTCの文字列をdatetimeに変換し、JSTに変える

例えば「2013-12-31T23:55:58Z」という、ISO 8061拡張表記の文字列をJSTに変換してみる。

やりたいことを図示すると、こうなる。

f:id:cultureeen:20131211191324p:plain

※時分秒の後ろに"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)