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

时间:2017-12-29 19:33:09

标签: python django datetime timezone django-views

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

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

2 个答案:

答案 0 :(得分:3)

没有。有些软件包可以根据IP地址检测时区。您可以查看https://github.com/adamcharnock/django-tz-detect

答案 1 :(得分:3)

Django没有检测到最终用户的时区。但它的作用非常聪明。

考虑一下:

Client               |  Server              | UTC
time      9:00 am    |  time      12:00 pm  | time   7:00 am
timezone  UTC+2:00   |  timezone  UTC+5:00  |

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

现在,让我们说客户端请求在数据库中创建一个新对象。该对象具有日期字段。所以Django所做的是,它将对象的日期保存在UTC下。

这是如何运作的?

Django将首先使用服务器的本地时间,即凌晨12:00。然后它将通过减去5小时将其转换为UTC时间,该小时变为上午7:00。这是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点添加的。