web-dev-qa-db-ja.com

Python正しいタイムゾーンで現在の時刻を取得する

今使っています

import datetime
print(datetime.datetime.now().strftime("%X"))

現在の時刻を文字列として表示します。
問題は、私のコンピューターがEurope/Berlinタイムゾーンで実行されており、UTCへの+2のオフセットがここで考慮されていないことです。 19:22:26の代わりに21:22:26を表示する必要があります。また、ここで見つけた他の回答とは異なり、呼び出して保存しません。

datetime.datetime(2014, 7, 10, 18, 44, 59, 193982, tzinfo=<UTC>)

しかし

datetime.datetime.now()

だから私は次のことを試しました(そして失敗しました):

>>> from pytz import timezone
>>> datetime.datetime.now().astimezone(timezone('Europe/Berlin'))
 ValueError: astimezone() cannot be applied to a naive datetime


編集:

回答

この質問はクローズとマークされているため、回答として投稿できません

この問題が発生したサーバーはもう存在しません。とにかく、チェックする価値のある他の事項を以下に示します。

  • サーバー/システムのタイムゾーンは正しく設定されていますか?
    • VMまたはDockerコンテナがホストと同期していない可能性があるため、確認する価値があります。
  • そのコンピューターの時刻は正しいですか?タイムゾーンを変更してから+2時間で終わりませんか?
49
luckydonald

ローカルタイムゾーンの現在時刻を単純なdatetimeオブジェクトとして取得するには:

from datetime import datetime
naive_dt = datetime.now()

予想される時間が返されない場合は、コンピューターの構成が誤っていることを意味します。最初に修正する必要があります(Pythonとは無関係です)。

UTCの現在時刻を単純なdatetimeオブジェクトとして取得するには:

naive_utc_dt = datetime.utcnow()

現在の時刻をPython 3.3+の認識されたdatetimeオブジェクトとして取得するには:

from datetime import datetime, timezone

utc_dt = datetime.now(timezone.utc) # UTC time
dt = utc_dt.astimezone() # local time

Tzデータベースから指定されたタイムゾーンの現在の時刻を取得するには:

import pytz

tz = pytz.timezone('Europe/Berlin')
berlin_now = datetime.now(tz)

DSTの移行中に機能します。タイムゾーンの過去のUTCオフセットが異なる場合、つまり、タイムゾーンが異なる時間に複数のtzinfoオブジェクトに対応している場合でも機能します。

96
jfs