Django如何处理每个用户不同时区的情况?理想情况下,我想在UTC时区中运行服务器(例如,在settings.py中设置TIME_ZONE =“UTC”),因此所有日期时间都以UTC格式存储在数据库中。像this这样的东西吓到了我,这就是为什么我更喜欢UTC的原因。
但是为每个用户存储时区并使用标准的django datetime格式和modelform包装器有多难。我是否期望必须在任何地方编写日期处理代码以将日期转换为用户的时区并再次返回UTC?
我仍在阅读django教程,但我知道在其他一些假设系统时区的框架中处理用户时区可能会有多大的痛苦,所以我想我现在就问。
我目前的研究包括搜索django文档,只找到one reference到时区。
附加:
答案 0 :(得分:7)
更新,2013年1月:Django 1.4现在有time zone support !!
历史原因的旧答案:
我将自己为我的应用程序解决这个问题。我解决这个问题的第一个方法是在this django-user's post中使用django核心开发人员Malcom Tredinnick的建议。您可能希望将用户的时区设置存储在其用户配置文件中。
我也非常鼓励你研究pytz module,这会让时区的工作变得不那么痛苦。对于前端,我根据pytz中的常见时区创建了一个“时区选择器”。我有一个区域的选择框,另一个用于该位置(例如US / Central用两个选择框渲染)。它使得选择时区比浏览400多个选项列表更方便。
答案 1 :(得分:4)
在django中编写时区感知代码并不难:
我编写了简单的django应用程序,它有助于处理django项目中的时区问题:https://github.com/paluh/django-tz。它基于Brosner(django-timezone)代码,但采用不同的方法来解决问题 - 我认为它实现了类似于你和FernandoEscher命题的东西。
所有日期时间值都存储在一个时区的数据库中(根据TIME_ZONE设置),并在模板和表单中转换为适当的值(即用户时区)(日期时间字段的表单小部件包含带时区的附加子小部件)。每个日期时间转换都是明确的 - 没有魔力。
此外,每个线程缓存允许您简化这些数据时间转换(实现基于django i18n翻译机制)。
当您想要记住用户时区时,您应该将时区字段添加到配置文件模型并编写简单的中间件(请参阅doc中的示例)。
答案 2 :(得分:3)
Django根本不处理它,主要是因为Python也没有。到目前为止,Python(Guido?)决定不支持时区,因为虽然这个世界的现实是“more political than rational, and there is no standard suitable for every application。”
对大多数人来说,最好的解决方案是最初不用担心它,并依赖于Django默认在settings.py文件TIME_ZONE = 'America/Los_Angeles'
中提供的内容来帮助以后。
鉴于你的情况pytz是要走的路(已经提到了)。您可以使用easy_install
进行安装。我建议客户端要求将服务器上的时间转换为UTC,然后将这些UTC时间转换为客户端上的用户本地时区(通过浏览器中的Javascript或通过iOS / Android操作系统)
将America/Los_Angeles
时区存储在数据库中的时间转换为UTC的服务器代码如下所示:
>>> # Get a datetime from the database somehow and store into "x"
>>> x = ...
>>>
>>> # Create an instance of the Los_Angeles timezone
>>> la_tz = pytz.timezone(settings.TIME_ZONE)
>>>
>>> # Attach timezone information to the datetime from the database
>>> x_localized = la_tz.localize(x)
>>>
>>> # Finally, convert the localized time to UTC
>>> x_utc = x_localized.astimezone(pytz.utc)
如果您将x_utc
发送到网页,Javascript可以将其转换为用户的操作系统时区。如果您将x_utc
发送到iPhone,iOS可以执行相同的操作,等等。我希望有所帮助。
答案 3 :(得分:2)
这里不是Django专家,但是daik Django没有魔法,我甚至无法想象任何可行的魔法。
例如:您并不总是希望以UTC格式保存时间。例如,在日历应用程序中,您希望以日历事件发生的本地时间保存日期时间。这可能与服务器和用户时区不同。因此,拥有自动将每个选定日期时间转换为服务器时区的代码将是非常糟糕的事情。
所以是的,你必须自己处理。我建议为所有内容存储时区,当然以UTC格式运行服务器,让应用程序生成的所有日期时间使用UTC,然后在显示时将它们转换为用户时区。这并不困难,只记得很烦人。当涉及到用户输入的日期时间时,如果您应该转换为UTC,则它取决于应用程序。我作为一般建议不要转换为UTC,而是保存在用户时区,以及时区的信息。
是的,时区是个大问题。我在这个烦人的问题上撰写了几篇博客文章,例如:http://regebro.wordpress.com/2007/12/18/python-and-time-zones-fighting-the-beast/
最后,您必须自己处理时区问题,因为大多数问题都没有真正正确的答案。
答案 4 :(得分:1)
您可以先看一下django-timezones应用程序。它提供了许多基于时区的模型字段(及其相应的表单字段和一些装饰器),您可以使用它们至少存储每个用户的不同时区值(如果没有别的话)。
答案 5 :(得分:1)
查看django-timezones应用程序,我发现它不支持MySQL DBMS,因为MySQL在日期时间内不存储任何时区引用。
好吧,我认为我设法通过分支Brosner library并修改它在模型中透明地工作来解决这个问题。
在那里,我正在做django翻译系统所做的事情,所以你可以获得用户独特的时区转换。在那里你应该找到一个Field类和一些datetime工具来始终将日期时间转换为用户时区。因此,每当您提出请求并进行查询时,所有内容都将被时间化。