9

settings.py私は持っています:

TIME_ZONE = 'Asia/Singapore'
USE_I18N = True
USE_L10N = True
USE_TZ = True

ユーザー (シンガポール在住)2013-10-07 01:00 A.M.が私のサイトのフォームに入力すると、私の (PostgreSQL) データベースに保存される値は2013-10-07 01:00:00+08. python manage.py shellセッション中にこの情報を取得すると、 2013-10-06 17:00:00+00:00. この情報をテンプレートでレンダリングしようとすると、同じことが起こります。

私が考えていること: Django は、ユーザーがシンガポール時間の 10 月 10 日の午前 1:00 に入力していることを認識し、これをデータベースに として保存します2013-10-07 01:00:00+08。ただし、Django がこの情報をデータベースから取得するときは、UTC 時間にフォーマットするため、2013-10-06 17:00:00+00:00.

私はその権利を持っていますか?もしそうなら、データベースに保存されているのと同じタイムゾーン情報を使用して (または少なくとも私のTIME_ZONE設定を使用して) Django に時間を表示させるにはどうすればよいですか? つまり、ユーザーが入力した日時とまったく同じ形式で日時を表示するにはどうすればよいでしょうか?

4

2 に答える 2

24

私は何が起こっているのかを理解しました。ここのドキュメントで読んだ内容に基づいて、Django を使用すると、ビュー、シェルなどの すべての場所USE_TZ=Trueで現在のタイム ゾーン (デフォルトTIME_ZONE設定)で日時が出力されると想定していました。

ただし、Django はテンプレート内でのみ変換を行い、その場合でもオブジェクトの最も直接的で基本的な呼び出しでのみ行うことが判明しましたdatetime

具体的には、objectを含むがあり、 を使用してテンプレートでDateTimeFieldその属性をレンダリングすると、現在のタイム ゾーンに変換された日時が取得されます。わーい。ただし、この機能は、 (時間を UTC で表示する)などのテンプレート内であっても、それ以外では機能しません。したがって、これは基本的に単なる非表示のテンプレート タグです。私が望んでいたほど魔法ではありません!datetime{{ object.datetime }}{{ object.datetime.hour }}

テンプレートに渡す前に、すべての日時をビューの現在のタイム ゾーンに変換する必要があるようです。私のデータベースには、表示したいタイムゾーンですべての日時が既に保存されていることを考えると、この種の奇妙で直感に反するものだと思います。データベースの値を UTC で表現する必要があることを Django に明示的に伝える必要があるのではないでしょうか。 Django に作業を自動的に実行させてから、ビューでそれらを元に戻すよりも?

編集: SOに関するこの回答により、私の特定の状況に対する解決策がかなり簡単になりました:

from django.utils.timezone import localtime

result = localtime(some_time_object)

編集: PostgreSQL のみがタイム ゾーン情報を保存し、その情報は UTC で保存されている生の日時値とは別であることが判明しました。したがって、Django がデフォルトですべてを UTC でレンダリングするのは理にかなっていると思います。他のデータベース バックエンドはタイム ゾーン情報を保存することさえしないからです。

于 2013-10-03T03:20:30.453 に答える
2

localtimeテンプレートタグを見ましたか?

更新:ただし、それはあなたが持っているように設定USE_TZを参照しますTrue

于 2013-10-02T09:54:51.403 に答える