デフォルトのdatetime
モジュールはタイムゾーンをうまく処理しません。現在のマシンのタイムゾーンと UTC を超えるものは、基本的にサポートされていません。
そのために外部ライブラリを使用するか、タイムゾーンオフセットを手動で処理する必要があります。
外部ライブラリ オプション:
Use を使用すると、使用dateutil.parser
したいほぼすべての日付や時刻の形式を処理できます。
from dateutil import parser
dt = parser.parse(s)
iso8601
ライブラリは、同じ形式のタイムゾーン オフセットを含む ISO 8601 形式のみを処理します。
import iso8601
datetimetext, tz = s.rsplit(None, 1) # only grab the timezone portion.
timezone = iso8601.iso8601.parse_timezone('{}:{}'.format(tz[:3], tz[3:]))
dt = datetime.strptime(datetimetext, '%a %b %d %H:%M:%S %Y').replace(tzinfo=timezone)
各アプローチのデモンストレーション:
>>> import datetime
>>> s = 'Fri Aug 17 12:34:00 2012 +0000'
>>> import iso8601
>>> timezone = iso8601.iso8601.parse_timezone('{}:{}'.format(tz[:3], tz[3:]))
>>> datetime.datetime.strptime(datetimetext, '%a %b %d %H:%M:%S %Y').replace(tzinfo=timezone)
datetime.datetime(2012, 8, 17, 12, 34, tzinfo=<FixedOffset '+00:00'>)
>>> from dateutil import parser
>>> parser.parse(s)
datetime.datetime(2012, 8, 17, 12, 34, tzinfo=tzutc())