GMail でメールを見ると、メールが送信された日付と時刻を表示する際にローカル タイムゾーンが使用されます。「Tue, 28 Aug 2012 02:49:13 -0500」が解析され、ローカル タイムゾーンに更新され、GMail 固有の方法でフォーマットされます。
stdlib の方法での解析とフォーマット
このemail.utils
モジュールには、タイムゾーン オフセットを持つ電子メール ヘッダーを具体的に処理するparsedate_tz()
関数が含まれています。
と互換性のあるタプルを返しますtime.struct_time
が、タイムゾーン オフセットが追加されています。追加のmktime_tz()
関数は、そのタプルをオフセット値 (UNIX エポックからの秒数) に変換します。datetime.datetime()
この値は、型オブジェクトに簡単に変換できます。
同じモジュールには、UNIX エポック タイムスタンプを電子メール互換の日付文字列に変換するformatdate()
関数もあります。
>>> from email.utils import parsedate_tz, mktime_tz, formatdate
>>> import time
>>> date = 'Tue, 28 Aug 2012 02:49:13 -0500'
>>> tt = parsedate_tz(date)
>>> timestamp = mktime_tz(tt)
>>> print formatdate(timestamp)
Tue, 28 Aug 2012 07:49:13 -0000
これで、送信メールに適した UTC 形式の日付が作成されました。これをローカルlocaltime
タイムゾーン (コンピューターによって決定される) として出力するには、フラグをTrue
次のように設定する必要があります。
>>> print formatdate(timestamp, True)
Tue, 28 Aug 2012 08:49:13 +0100
より優れたツールを使用した解析とフォーマット
タイムゾーンを扱おうとしているうちに、物事が複雑になってきていることに注意してください。このformatdate()
関数では、(GMail のように) 少し異なる形式でフォーマットするオプションは提供されず、別のタイムゾーンを選択して作業することもできません。
外部python-dateutil
モジュールに入ります。ほぼ何でも処理できる解析機能があり、タイムゾーンを適切にサポートしています
>>> import dateutil.parser
>>> dt = dateutil.parser.parse(date)
>>> dt
datetime.datetime(2012, 8, 28, 2, 49, 13, tzinfo=tzoffset(None, -18000))
この関数はinstanceparse()
を返すため、書式設定がはるかに簡単になります。これで、関数を使用して、メール クライアントと同じように出力できます。datetime.datetime()
.strftime()
>>> print dt.strftime('%a, %b %d, %Y at %I:%M %p')
Tue, Aug 28, 2012 at 02:49 AM
もちろん、これはまだローカル タイムゾーンです。代わりにこれをタイムゾーンにキャストするには、新しいオブジェクトで.astimezone()
メソッドを使用します。tzone
このpython-dateutil
パッケージには便利なものがあります。
ローカルタイムゾーンで(マシンに)印刷する方法は次のとおりです。
>>> import dateutil.tz
>>> print dt.astimezone(dateutil.tz.tzlocal()).strftime('%a, %b %d, %Y at %I:%M %p')
Tue, Aug 28, 2012 at 09:49 AM
または、代わりに特定のタイムゾーンを使用します。
>>> print dt.astimezone(dateutil.tz.tzstr('Asia/Kolkata')).strftime('%a, %b %d, %Y at %I:%M %p')
Tue, Aug 28, 2012 at 07:49 AM