datetime.datetime.today()
何かがどれくらい前だったかを計算するために、の値から 1 つの日付値を減算しようとしています。 しかし、次のようなエラーが表示されます:
TypeError: can't subtract offset-naive and offset-aware datetimes
からの戻り値はdatetime.datetime.today()
「タイムゾーン対応」ではないようですが、他の日付値は対応しています。 からの戻り値をdatetime.datetime.today()
タイムゾーン対応にするにはどうすればよいでしょうか?
理想的な解決策は、タイムゾーンを自動的に認識することです。
現時点では、現地時間で時刻が表示されていますが、これは PST、つまり UTC - 8 時間です。最悪の場合、datetime
返されるオブジェクトにタイムゾーン値を手動で入力してdatetime.datetime.today()
、UTC-8 に設定する方法はありますか?
ベストアンサー1
標準ライブラリでは、独自のタイムゾーンクラスを作成せずに、クロスプラットフォームでタイムゾーンを認識する方法はありません。(編集: Python 3.9では、zoneinfo
この機能を提供する標準ライブラリにはありません。
Windowsでは がありますwin32timezone.utcnow()
が、これはpywin32の一部です。pytzライブラリには、ほとんどのタイムゾーンのデータベースが常に更新されています。
ローカル タイムゾーンでの作業は非常に難しい場合があります (以下の「さらに詳しく読む」リンクを参照)。そのため、特に 2 つの時点の差を計算するなどの算術演算の場合は、アプリケーション全体で UTC を使用することをお勧めします。
現在の日付/時刻は次のように取得できます:
import pytz
from datetime import datetime
datetime.utcnow().replace(tzinfo=pytz.utc)
これに留意しdatetime.today()
、UTC 時間ではなくローカルdatetime.now()
時間を返すようにしてください。そのため、それらに適用すると正しくありません。.replace(tzinfo=pytz.utc)
もう一つのよい方法は次のとおりです。
datetime.now(pytz.utc)
これは少し短く、同じことを行います。
多くの場合 UTC を優先する理由については、以下を参照してください。
- pytz ドキュメント
- すべての開発者が時間について知っておくべきこと– 多くの実際の使用例のための開発のヒント
- 時間とタイムゾーンの問題 - Computerphile– タイムゾーンを扱う複雑さについての面白くて目を見張るような説明(ビデオ)