Pythonのdatetime
仕組みについて誤解しています。最近、次の 2 行のコードを見ました。
datetime.datetime.utcnow()
datetime.datetime.utcnow().replace(tzinfo=pytz.utc)
そして、私は実際にそれらの違いが何であるか理解できませんか? これらの 2 つのオブジェクトが異なる方法で動作するのは、どのような状況ですか? この質問を明確にしていただきありがとうございます。
1 つ目はタイムゾーンのない単純なオブジェクトを作成しdatetime
、2 つ目はタイムゾーン オブジェクトをアタッチして、そのオブジェクトにタイムゾーンを認識させます。
どちらのオブジェクトも、UTC に従って日付と時刻を提供します。
datetime
モジュールのドキュメントからの引用:
認識オブジェクトは、タイム ゾーンや夏時間情報など、適用可能なアルゴリズムおよび政治的な時間調整について十分な知識を持っており、他の認識オブジェクトとの相対的な位置を特定できます。認識オブジェクトは、解釈できない特定の瞬間を表すために使用されます[1]。
単純なオブジェクトには、他の日付/時刻オブジェクトとの相対位置を明確に特定するための十分な情報が含まれていません。単純なオブジェクトが協定世界時 (UTC)、現地時間、または他のタイムゾーンの時間を表すかどうかは、純粋にプログラム次第です。特定の数値がメートル、マイル、または質量を表すかどうかはプログラム次第です。単純なオブジェクトは、現実のいくつかの側面を無視するという犠牲を払って、理解しやすく、操作しやすいです。
ナイーブ オブジェクトと認識オブジェクトは比較できません。また、ナイーブ オブジェクトと認識日時オブジェクトの間で日時演算を実行することもできません。
オブジェクトに対する多くの操作datetime.datetime
は、2 つのタイプで異なります。ドキュメントで「ナイーブ」を検索することをお勧めします。操作が異なるのは、追加のタイムゾーン情報が存在するためです。たとえば、.utctimetuple()
は と同じ値を返します.timetuple()
が、ナイーブ オブジェクトの場合は DST が強制的にオフにされますが、認識オブジェクトの場合、返されるタプルは、オブジェクトに関連付けられたタイムゾーンが何であれ UTC 時間を表します。
これは、datetime オブジェクトにタイムゾーンを割り当てるために使用されます。tzinfo を設定しないと、次を使用してタイムゾーンを設定できませんdatetime.astimezone
以下も参照してください: datetime.datetime.utcnow() なぜ tzinfo がないのですか?