Django是否会自动检测最终用户的时区?

Max*_*ler 4 python django timezone datetime django-views

我正在Django中构建一个应用程序,该应用程序允许最终用户检索在一天中对一天中的时间(上午12点至上午12点)敏感的信息。我将此信息作为整数存储在数据库中,该整数表示自午夜以来以30分钟为增量的秒数。我正在查看Django的时区文档:https : //docs.djangoproject.com/en/2.0/topics/i18n/timezones/,发现自己对Django是否自动使用最终用户时间或是否必须收集此时间感到困惑信息并在我看来对其进行解释。

任何信息都有帮助!谢谢。

xyr*_*res 5

Django无法检测最终用户的时区。但是它的确很聪明。

考虑一下:

Client               |  Server              | UTC
time      9:00 am    |  time      12:00 pm  | time   7:00 am
timezone  UTC+2:00   |  timezone  UTC+5:00  |
Run Code Online (Sandbox Code Playgroud)

如您所见,服务器和客户端位于不同的时区,因此具有不同的本地时间。

现在,假设客户端发出了在数据库中创建新对象的请求。该对象具有日期字段。因此Django要做的是,将对象的日期保存在UTC下。

这是如何运作的?

Django首先将采用服务器的本地时间,即12:00 am。然后,它将减去5小时(即7:00 am)将其转换为UTC时间。这是Django用于保存对象的时间。


现在,让我们稍后再说,客户希望看到他何时创建该对象。

对象的创建时间为7:00 am UTC。要将对象的创建时间显示给客户端,您可以在另一个答案中使用由Jason链接的应用程序。但是我发现使用IP进行时区查找不是很可靠,因为用户可能正在使用代理。

或者,您可以使用UTC呈现时间,并使用一些JavaScript将其转换为客户的本地时间。由于JS在浏览器上运行,因此它将从他们的计算机中准确选择客户端的时区。

最后,当您转换7:00 am UTC为客户端的时区时,通过增加2小时(因为它比UTC提前2小时),客户端将看到对象的创建时间,9:00 am这正是他们所期望的。

不仅如此,如果在UTC-5:00时区地球的另一侧有另一个客户端,您可以通过减去5小时来向他们显示对象的时间2:00 am。因此,根据该用户的说法,它是在凌晨2:00添加的。

  • @MaxMiller您必须设置 [`USE_TZ=True`](https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-USE_TZ) 以启用时区支持。 (2认同)