Django Timezone Awareness - 要以UTC格式存储的数据

时间:2017-12-07 00:10:02

标签: python django postgresql datetime timezone

这是我第一次开发时区感知的Web应用程序。我正在使用Django 1.11.7。我看了很多关于时区的帖子,说实话,我开始觉得我只是不理解时区的概念... 0_o

我正在使用start_timeend_time为每个预订制作预订应用。

我希望用户能够在他的时区中体验日期和时间。另一方面,我希望这些日期和时间以UTC格式存储在postgresql数据库中。

Five hour timezone difference between UTC and Ottawa

如果我选择保留,例如,在上午12点到凌晨2点(今天)之间,数据库中的结果应显示在下午5点到晚上7点(今天)之间。
正确?

Django国际化设置:

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_TZ = True
USE_L10N = True
USE_I18N = True

在数据库创建期间:

start_time      TIMESTAMP WITH TIME ZONE NOT NULL,
end_time        TIMESTAMP WITH TIME ZONE NOT NULL

使用Django的内置管理页面功能,我输入以下信息:

Admin form showing note about the time difference

但是当我在数据库中查找结果时,这就是我得到的结果:

2017-12-05 19:00:00-05 | 2017-12-05 20:59:59-05

存储的结果与我期望的方向相反。我在期待:

2017-12-06 05:00:00+05 | 2017-12-06 07:00:00+05

如果我的期望是错误的,一切都运转良好,如果你能解释我在阅读时如何解释时区,我将不胜感激。

否则,如果我的期望在哪里,我会很感激任何建议。

谢谢。

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我和酒店预订有一个非常类似的问题。这个答案让我走上正轨。

https://stackoverflow.com/a/18307581/4660189

这里的关键在于你所说的:

  

我希望用户能够在他的时区中体验日期和时间。

"他的时区"需要通过中间件来处理。这样可以为每个用户分配一个时区,从而系统将相应地处理该用户的所有时间/日期。

这应该让你去。快乐的编码,欢迎时间弯曲的现实。

答案 2 :(得分:0)

这里的基本问题是你误解了管理员为你做了什么(“我希望用户能够在他的时区中体验日期和时间”)。实际上,管理员会解释服务器时区中的所有日期时间(在您的情况下为UTC)。

  

注意:您比服务器时间晚了5个小时

实际上意味着:

  

警告:您在此处输入的值将在服务器时区中解释,这比您提前5小时。

(我同意你的看法,这个措辞含糊不清。你可能想file a ticket关于改进它。)

有关此问题的背景信息,请参阅this ticket。问题的根源在于无法在浏览器中获取用户的时区。您可以做的是将浏览器中的当前时间与服务器上的当前时间进行比较,如果它们不同,则发布上面的警告。

如果你想在用户的时区解释日期时间,除了要求用户明确指出他们的时区,在某处记录,然后activate()使其成为当前时区之外别无选择。这是described in the documentation技术。我相信有第三方软件包根据pytz中的时区列表提供时区选择小部件。

你也误读了时间显示。我认为你期待的是2017-12-06 05:00:00+00。相反,结果是2017-12-06 00:00:00+00中的UTC,或者等同于渥太华时间的2017-12-05 19:00:00-05,这就是您所报告的内容。