1

ユーザーがアクティビティを作成できるDjangoアプリケーションがあり、アクティビティに対して多数のログエントリを作成します。アクティビティには作成日時があり、ログ エントリにも作成日時があります。

アクティビティは、作成時のユーザーのタイムゾーンで作成する必要があります。具体的には、特定のユーザーが別々のタイムゾーンで 2 つのアクティビティを持つ場合があります。タイムゾーンの設定はユーザーごとではなく、アクティビティごとです。ブラウザーの JavaScript で、UTC からユーザーの現在のオフセットを取得できます (喜んでそれに依存します)。

私が知らないのは、これらの時間をデータベースに保存し、レンダリング時に正しく表示するにはどうすればよいですか?

USE_TZ をオンにしました。ここ英国では、すべてが機能します。アクティビティを作成するときに、作成された日時を としてdjango.utils.timezone.now()保存し、(JavaScript からの) ユーザーの現在のオフセットを timezoneHoursOffset としてアクティビティに保存します。次に、アクティビティとそのログ エントリをページに表示するときに、これを でラップし{% timezone "Etc/GMT+(timezoneHoursOffset)" %} ... {% endtimezone %}ます。

ただし、サーバーが英国にない場合、このアプローチは機能しません。時間は UTC としてデータベースに保存されます (ORM を使用せずにデータベース自体をチェックインすることでこれを確認しました)。その後、その時間は ORM によって UTC から 8 時間遅れるように「変更」されます (サーバーのタイムゾーンがUTC-8) (これで正確な時刻が得られます!) そして、タグは時刻からさらに{% timezone %}8 時間を減算します。つまり、表示される時刻は本来あるべき時刻より 8 時間遅れています。

時間を別の方法で保存する必要があるかどうかはわかりません。出力時にそれらを変更します。タイムゾーン テンプレート タグの使用。または、他の何か。これは非常に紛らわしいです。この状況をどのように処理するようアドバイスしていただけますか?

4

2 に答える 2

1

答えを参照してください。「Etc/GMT」タイムゾーンの符号が逆になっています。たとえば、私は+0800にいますが、'Etc/GMT-8'代わりにすべきです'Etc/GMT+8'(そして、UTC-8は実際にはそうあるべきだと思います"Etc/GMT+8"):

>>> from django.template import Template, Context
>>> from django.utils.timezone import now
>>> print(Template("""{% load tz %}
localtime: {{ t }}
Etc/GMT-8: {{ t|timezone:"Etc/GMT-8" }}
Etc/GMT+8: {{ t|timezone:"Etc/GMT+8" }}
""").render(Context({'t':now()})))

localtime: Jan. 29, 2013, 11:48 p.m.
Etc/GMT-8: Jan. 29, 2013, 11:48 p.m.
Etc/GMT+8: Jan. 29, 2013, 7:48 a.m.

だから、あなたはあなたのtimezoneHoursOffset...を逆にする必要があります

ドキュメントによると、DBの保存には、UTCでデータを保存することをお勧めします。

また、DSTのために、JavaScriptが正しい時間オフセットを生成することを確認する必要があります。可能であれば、タイムゾーン名を保存し、それに応じて使用することをお勧めします。

于 2013-01-29T15:52:00.573 に答える
1
from datetime import datetime
from dateutil import zoneinfo

from_zone = zoneinfo.gettz('UTC')
to_zone = zoneinfo.gettz('UK/UK') 

utc = created # your datetime object from the db

# Tell the datetime object that it's in UTC time zone since 
# datetime objects are 'naive' by default
utc = utc.replace(tzinfo=from_zone)

# Convert time zone
eastern_time = utc.aztimezone(to_zone)
于 2013-01-29T15:58:47.133 に答える