Django如何处理每个用户不同时区的情况?理想情况下,我希望在UTC时区运行服务器(例如,在settings.py
中设置TIME_ZONE="UTC"
),因此所有日期时间都以UTC存储在数据库中。像this这样的东西让我害怕,这就是为什么我在任何地方都更喜欢UTC。
但是为每个用户存储一个时区并仍然使用标准的django日期时间格式和modelform Package 器有多难呢?我是否需要在所有地方编写日期处理代码,以便将日期转换为用户的时区,然后再转换回UTC?
我还在学习django教程,但我知道在其他一些框架中处理用户时区是多么痛苦,这些框架假设系统时区无处不在,所以我想我现在应该问一下。
我当时的研究包括搜索django文档,只找到一个关于时区的引用。
附加:
- 有一个关于Django和时区处理的few bugs submitted。
- Babel有一个some contrib code for django,它似乎可以处理地区中的时区格式。
7条答案
按热度按时间q5iwbnjs1#
2013年1月更新:Django 1.4现在支持time zone!!
历史原因的老答案:
我将在我的申请中自己解决这个问题。我解决这个问题的第一个方法是遵循django核心开发人员马尔科姆Tredinnick在this django-user's post中的建议。您可能希望将用户的时区设置存储在他们的用户配置文件中。
我还强烈建议您研究一下pytz module,它可以让使用时区时不那么痛苦。对于前端,我基于pytz中的常用时区创建了一个“时区选择器”。我有一个区域选择框,另一个位置选择框(例如:US/Central使用两个选择框呈现)。它使得选择时区比费力地通过400多个选择的列表稍微方便一些。
d8tt03nd2#
在django中编写时区感知代码并不难:
我写了一个简单的django应用程序来帮助处理django项目中的时区问题:https://github.com/paluh/django-tz。它基于Brosner(django-timezone)代码,但采用了不同的方法来解决问题-我认为它实现了类似于您和FernandoEscher命题的东西。
所有日期时间值都存储在一个时区的数据库中(根据TIME_ZONE设置),并转换为适当的值(即用户时区)在模板和表单中完成(有一个用于datetime字段的表单小部件,其中包含带有时区的附加子小部件)。每个日期时间转换都是显式的-没有魔术。
此外,每个线程的缓存允许你简化这些数据时间转换(实现基于django i18 n翻译机制)。
当你想记住用户时区时,你应该在profile模型中添加timezone字段,并编写简单的中间件(参考文档中的示例)。
mrzz3bfm3#
Django根本不处理它,很大程度上是因为Python也不处理。Python(Guido?)迄今为止决定不支持时区,因为尽管世界的现实是“政治多于理性,没有适合每种应用程序的标准。”
对于大多数人来说,最好的解决方案是一开始不要担心它,并依赖于Django在settings.py文件
TIME_ZONE = 'America/Los_Angeles'
中默认提供的帮助。考虑到你的情况,pytz是一个不错的选择(前面已经提到过)。您可以使用
easy_install
安装它。我建议在客户端请求时将服务器上的时间转换为UTC,然后在客户端将这些UTC时间转换为用户的本地时区(通过浏览器中的JavaScript或通过iOS/Android的操作系统)。将存储在数据库中的
America/Los_Angeles
时区的时间转换为UTC的服务器代码如下所示:如果您将
x_utc
发送到网页,JavaScript可以将其转换为用户的操作系统时区。如果你把x_utc
发送到iPhone,iOS也可以做同样的事情。希望能帮上忙。zzoitvuj4#
我不是DjangoMaven,但是afaik Django没有魔法,我甚至无法想象任何这样的魔法会起作用。
例如:你并不总是想保存UTC时间。例如,在日历应用程序中,您希望将日期时间保存为日历事件发生的本地时间。它可以与服务器和用户的时区不同。因此,拥有自动将每个选定的日期时间转换为服务器时区的代码将是一件非常糟糕的事情。
所以,是的,你必须自己处理。我建议存储所有内容的时区,当然,以UTC运行服务器,让应用程序生成的所有日期时间都使用UTC,然后在显示时将它们转换为用户的时区。这不是很难,只是很难记住。当涉及到用户输入的日期时间时,它取决于应用程序是否应该转换为UTC。我一般建议不要转换为UTC,而是保存在用户的时区中,并提供时区信息。
是的,时区是个大问题。我已经写了几篇关于这个恼人问题的博客文章,比如:http://regebro.wordpress.com/2007/12/18/python-and-time-zones-fighting-the-beast/
最后你将不得不自己处理时区问题,因为大多数问题都没有真实的正确的答案。
ut6juiuv5#
您可以先看一下django-timezones应用程序。它提供了许多基于时区的模型字段(以及它们对应的表单字段和一些装饰器),您可以使用它们来至少 * 存储 * 每个用户的不同时区值(如果没有其他功能)。
oknrviil6#
查看django-timezones应用程序,我发现它不支持MySQL DBMS,因为MySQL不存储datetime中的任何时区引用。
好吧,我想我可以通过分叉Brosner library并修改它以在模型中透明地工作来解决这个问题。
在那里,我做了和django翻译系统一样的事情,所以你可以得到用户唯一的时区转换。在那里,您应该找到一个Field类和一些datetime实用程序,以便始终将日期时间转换为用户时区。所以每次你发出一个请求,做一个查询,一切都将被时间分区。
Give it a try!
ibrsph3r7#
您可以使用django-tz-detect,它可以自动和动态地为每个用户检测和设置时区,而不是在
settings.py
中只使用一个设置为TIME_ZONE的时区。所以,你可以看到我的答案解释如何设置django-tz-detect
的细节。