ローカル タイムゾーンをオブジェクトとして取得するには、モジュールpytz.timezone
を使用できます。tzlocal
#!/usr/bin/env python
from datetime import datetime
import pytz # pip install pytz
from tzlocal import get_localzone # pip install tzlocal
local_tz = get_localzone()
local_now = datetime.now(local_tz)
utc_now = local_now.astimezone(pytz.utc)
seconds = (utc_now - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()
utc_then = datetime.fromtimestamp(seconds, pytz.utc)
local_then = utc_then.astimezone(local_tz)
print("%s %s" % (utc_now, utc_then))
print("%s %s" % (local_now, local_then))
- 使用しない
datetime.now()
でください。たとえば、DST の変更中など、あいまいな場合があります。私の例のように tzinfo を明示的に渡すか、使用しますdatetime.utcnow()
- 使用しないでください
utc_now.strftime('%s')
-- タイムゾーン情報を無視し (現在のローカル タイムゾーンを使用します)、移植性がありません。代わりにメソッドまたはその類似物を使用してくださいdatetime.timestamp()
- 使用しないでください
utc.localize(datetime.fromtimestamp(seconds))
-- .fromtimestamp()
UTC とは異なる可能性があるローカル タイムゾーンで単純な datetime オブジェクトを返します。私の例のように tzinfo を明示的に渡すか、datetime.utcfromtimestamp()
UTC 時間を表す単純な datetime オブジェクトを取得するために使用します
- 単純な日時オブジェクトでは使用
datetime.utctimetuple()
しないでください。UTC に変換されません。オブジェクトが既に UTC にある場合:utc_now.timetuple()
同じ時刻を返します。
あいまいな現地時間の例外を発生させるには、次を使用しますlocalize(is_dst=None)
。
aware_dt = tz.localize(naive_dt, is_dst=None)
がないと、 DST の変更中に間違った結果を返すis_dst=None
可能性が 50% あります。tz.localize()
特定のケースで例外ではなく、おそらく間違った結果を取得することが望ましい場合は、明示的に渡してis_dst=False
それを思い出させることができます。
一般に、ソースと宛先のタイムゾーンがどちらも UTC でない場合、pytz
ドキュメントtz.normalize()
ではafter callを推奨しています。.astimezone()