2

これは午前 4 時のバグかもしれませんが、すべて正しく行っていると思いますが、DST が UTC タイムスタンプからローカライズされた日時に変換されているようには見えません。

>>> from datetime import datetime
>>> import pytz
>>> eastern = pytz.timezone("US/Eastern")
>>> utc = pytz.utc
>>> local_now = eastern.localize(datetime.now())
>>> utc_now = local_now.astimezone(utc)
>>> seconds = int(utc_now.strftime("%s"))
>>> utc_then = utc.localize(datetime.fromtimestamp(seconds))
>>> local_then = utc_then.astimezone(eastern)
>>> print utc_now, utc_then
2013-06-16 10:05:27.893005+00:00 2013-06-16 11:05:27+00:00
>>> print local_now, local_then
2013-06-16 06:05:27.893005-04:00 2013-06-16 07:05:27-04:00
4

3 に答える 3

0

ローカル タイムゾーンをオブジェクトとして取得するには、モジュール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()

于 2014-08-20T07:58:45.633 に答える