51

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

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

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

4

2 に答える 2

85

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()可能性があります。指定された日付に有効な正しいオフセットを選択します。たとえば、米国東部時間帯の DST の開始日と終了日は、時間の経過とともに変更されています。tz.localize()

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

dt = tz.localize(naive, is_dst=True)

または、設定して選択を完全にオフにすることもできますis_dst=None。その場合、またはまれにタイムゾーンにデフォルトが設定されてない場合、あいまいな日時値によりAmbiguousTimeError例外が発生します。フラグは、is_dstあいまいな datetime 値に対してのみ参照され、それ以外の場合は無視されます。

逆に戻るには、タイムゾーン対応オブジェクトをナイーブ オブジェクトに戻します。次を使用します.replace(tzinfo=None)

naivedt = awaredt.replace(tzinfo=None)
于 2012-12-21T17:31:07.627 に答える
18

元の日時が、追加しようとしているタイムゾーンで「測定」されていることがわかっている場合replaceは、localize.

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

これが理にかなっている場合が 2 回あると想像できます (2 回目は私に起こりました)。

  1. サーバーのロケールが間違ったタイムゾーンに設定されてdatetimeおり、この間違ったタイムゾーンを認識させることでインスタンスを修正しようとしています (おそらく後で「正しい」タイムゾーンにローカライズして、now() の値が他の値と一致するようにします)あなたがそれを比較している時間(おそらくあなたの時計)
  2. timeインスタンス ( NOT a datetime) にタイムゾーン (tzinfo) 属性を「タグ付け」して、後で属性を使用して完全なdatetimeインスタンスを形成できるようにします。
于 2015-03-25T18:22:49.973 に答える