あなたはこれを間違って解釈しています。データベースには、ほとんどの場合UTC時間が保存されます。 PostgreSQLを使用している場合、データベースはタイムゾーン情報とともに時間を保存できますが、実用的な目的(*)では、データベース内の時間がUTCとして(つまり、任意の時間に変換できる絶対時間として)保存されていると考えるのが最も簡単です。ゾーン)USE_TZ = True
の場合 。これは常に正しい時点を表しており、タイムゾーンを覚えたり想定したりする必要はありません。そして、私が知る限り、Djangoは常にUTCタイムゾーンで時刻認識として時刻を保存します。
したがって、select
を使用して時間オブジェクトをフェッチする場合 psql 、マシンのローカルタイムゾーン(psqlを実行しているタイムゾーン)の時刻を取得しています。 「America/New_York」の誰かが同じ選択クエリを実行すると、-04タイムスタンプが表示されます。日付が2019-03-20だったとしたら、2019-03-20 10:50:00+00
を見たことがあるでしょう。 その日、ヨーロッパ/ロンドンとUTCは同じだったからです。
DateTimeField
の値をフェッチする場合 Pythonとしてdatetime.datetime
オブジェクトの場合、Djangoは常にUTC値をフェッチします。理由は次のとおりです。
これにより、Pythonコードでこれらの日時オブジェクトを簡単に操作できるようになります。これらは常にUTC時間です。
これらの値をPDFで印刷する場合は、Djangoがテンプレートのレンダリングに使用するのと同じ方法を使用します。
from django.utils import timezone
print(timezone.template_localtime(Booking.objects.get(pk=280825).start))
これにより、日時がデフォルトのタイムゾーンでレンダリングされます(またはactivate()
の場合 現在のタイムゾーン内の別のタイムゾーン 。
(*)注:データベースに保存されているタイムゾーンに意味を与えず、すべてUTCであるかのように考える必要がある理由:さまざまなタイムゾーンでサーバーを実行すると、実際には異なるタイムゾーンでタイムスタンプが保存される可能性があります。それらはすべて正しい(絶対タイムスタンプ)ので、他のタイムゾーンに変換できます。したがって、基本的に、保存に使用されるタイムゾーンは無意味です。