web-dev-qa-db-ja.com

pythonの単純なdatetimeインスタンスにタイムゾーンを追加する方法

タイムゾーン情報のないdatetimeがあります。現在、タイムゾーン情報を取得していますが、タイムゾーンを既存の日時インスタンスに追加したいのですが、どうすればよいですか?

d = datetime.datetime.now()
tz = pytz.timezone('Asia/Taipei')

タイムゾーン情報tzをdatetime aに追加する方法

34
waitingkuo

tz.localize(d)を使用して、インスタンスをローカライズします。 ドキュメント から:

1つは、pytzライブラリが提供するlocalize()メソッドを使用することです。これは、単純な日時(タイムゾーン情報のない日時)をローカライズするために使用されます。

_>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
>>> print(loc_dt.strftime(fmt))
2002-10-27 06:00:00 EST-0500
_

してはいけないtz.localize()を使用するが、datetime.replace()を使用すると、historical代わりにオフセットが使用されます。 tz.localize()は、指定された日付に対して有効な正しいオフセットを選択します。たとえば、米国東部時間帯のDSTの開始日と終了日は、時間の経過とともに変更されています。

夏時間から冬時間への移行期間またはその逆の期間にまたがるためにあいまいな日時値をローカライズしようとすると、タイムゾーンが参照され、結果の日時オブジェクトに.dst()がTrueを返すかどうかが確認されますまたはFalse。 .localize()の_is_dst_キーワード引数を使用して、タイムゾーンのデフォルトをオーバーライドできます。

_dt = tz.localize(naive, is_dst=True)
_

または、_is_dst=None_を設定して選択を完全にオフにします。その場合、またはまれに、タイムゾーンにデフォルト値が設定されていないis、あいまいなdatetime値はAmbiguousTimeErrorになります例外が発生します。 _is_dst_フラグは、あいまいな日時値についてのみ参照され、それ以外の場合は無視されます。

別の方法に戻るには、タイムゾーン対応オブジェクトを単純なオブジェクトに戻し、.replace(tzinfo=None)を使用します。

_naivedt = awaredt.replace(tzinfo=None)
_
59
Martijn Pieters

元の日時が追加しようとしているタイムゾーンで「測定」されていることがわかっている場合は、replaceではなくlocalizeを使用できます(ただし、使用しないでください)。

# d = datetime.datetime.now()
# tz = pytz.timezone('Asia/Taipei')
d = d.replace(tzinfo=tz)

私はこれが理にかなっているかもしれない2回想像することができます(2番目のものは私に起こりました):

  1. サーバーロケールが誤ったタイムゾーンに設定されており、datetimeインスタンスを修正しようとしています。この間違ったタイムゾーンを認識させます(おそらく、後で正しい値にローカライズして、 ()比較する他の時間に一致します(おそらく時計)
  2. タイムゾーン(tzinfo)属性を持つtimeインスタンス([〜#〜] not [〜#〜] a datetime)に「タグ付け」したいので、その属性は、後で完全なdatetimeインスタンスを形成するために使用できます。
6
hobs