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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django会自动检测最终用户的时区吗?相关的知识,希望对你有一定的参考价值。

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

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

答案

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

另一答案

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点添加的。

以上是关于Django会自动检测最终用户的时区吗?的主要内容,如果未能解决你的问题,请参考以下文章

查询 Django 模型时,如何将 Django 中的 DateTimeField 从 UTC 转换为最终用户的时区(通常是 PST)?

如何设置 JVM 时区

使用rubyonrails activeadmin检测用户时区常量

DateTime.Now 和文化/时区特定

VSCode 配置 用户自定义代码片段 自定义自动代码补充

Django 自动将日期时间字符串转换为本地时区