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