web-dev-qa-db-ja.com

Django:作成されたタイムゾーンを日時オブジェクトに認識させる方法は?

リモートサーバーに海洋潮dataデータを要求するプログラムを実行しています。この潮dataデータのtimedateは、私のマシンのローカルタイムゾーンに基づいて計算されています。これらのローカルの日付と時刻を使用してdatetimeオブジェクトを作成し、それをDjangoモデルに保存します。

datetime_obj = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute)

Djangoに投稿する前に、datetimeオブジェクトがローカルタイムゾーンに基づいて作成されたことを認識するようにするにはどうすればよいですか。

私はそれを投稿する前にこのように見えるようにしたいと思います:

datetime_obj = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute, loc_timezone)

マシンのローカルタイムゾーンを動的に取得するにはどうすればよいですか?そして、すべてのユーザーが自分のローカルタイムゾーンに変換された時間を見ることができるようにする方法。

20
sgarza62

まず、Djangoのタイムゾーンの documentation に精通していることを確認し、_USE_TZ = True_を設定して、pytzをインストールします。

私はあなたの日付がどこから来たのかよくわかりません。データの一部としてサーバーから送信される場合(つまり、潮itが測定された時刻を表す場合)は、既にUTCであるか、使用しているタイムゾーンを知る必要があります。モデルを作成する場合、最も簡単なのは、モデルを作成するときに Django.utils.timezone.now() (タイムゾーン対応の日時を返す)を使用することですインスタンス。

説明したとおりに手動で作成する必要がある場合は、使用法 here に従うか、 make_aware()を使用します。

_from Django.utils.timezone import make_aware

naive = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute)
make_aware(naive)  # current timezone, or...
make_aware(naive, timezone=pytz.timezone("Europe/Helsinki"))  # ...specific timezone
_

current timezone は、デフォルトのタイムゾーンになります( _TIME_ZONE_ 設定で定義) ' activate() を使用して別のものを指定しました。デフォルトのタイムゾーンは、サーバーのシステムタイムゾーンと同じ場合と異なる場合があります。 pytzが理解できる形式でシステムのタイムゾーンを取得する方法については、 this answer で説明しています。

最後に、 here で説明したように、ローカルタイムゾーンに変換された時刻がユーザーに表示されることは重要です。

現在のタイムゾーンは、翻訳の現在のロケールに相当します。ただし、Djangoはユーザーのタイムゾーンを自動的に決定するために使用できるAccept-Language HTTPヘッダーに相当するものはありません。代わりに、Djangoはタイムゾーン選択機能を提供します。それらを使用して、あなたにとって意味のあるタイムゾーン選択ロジックを構築します。

ガイダンスについては、そこの例を参照してください。

from Django.utils import timezone
import pytz

timezone.activate(pytz.timezone("Asia/Kolkata"))
timezone.localtime(timezone.now())
5
HimalayanCoder