1

我有一个 Django 应用程序,用户可以在其中创建一个活动,然后为一个活动创建多个日志条目。一个活动有一个创建的日期时间,一个日志条目也有一个创建的日期时间。

应使用创建用户在创建活动时的时区创建活动。具体来说,给定用户可能在不同的时区有两个活动;时区设置不是每个用户,而是每个活动。我可以在浏览器中的 JavaScript 中从 UTC 导出用户当前的偏移量(我很高兴依赖它)。

我不知道的是:如何将这些时间保存到数据库中,然后在渲染时正确显示它们?

我打开了 USE_TZ。在英国,一切正常:创建 Activity 时,我将创建的日期时间保存为django.utils.timezone.now(),并将用户当前的偏移量(来自 JavaScript)保存为 Activity 中的 timezoneHoursOffset。然后,当我在页面上显示 Activity 及其日志条目时,我将其包装在{% timezone "Etc/GMT+(timezoneHoursOffset)" %} ... {% endtimezone %}.

但是,如果服务器不在英国,则此方法不起作用。时间以 UTC 格式保存在数据库中(我已经通过检查数据库本身而不是使用 ORM 来验证这一点),然后 ORM 将时间“更改”为比 UTC 晚八小时(因为服务器的时区是UTC-8)(这给出了正确的时间!),然后{% timezone %}标签再减去八个小时的时间,这意味着显示的时间比它应该的时间晚了八个小时。

我不确定我是否应该以不同的方式节省时间。在输出时更改它们;使用时区模板标签;或者是其他东西。这东西很混乱。你会建议我如何处理这种情况?

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...

对于数据库存储,根据doc,最好以 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 回答