Django时区:感觉有点困惑

时间:2011-07-25 21:36:45

标签: python django datetime timezone utc

所以,我们的设置中有'Europe / Moscow'TZ。 目前这意味着夏令时(这将在未来发生变化,但目前是UTC + 03/04)。

据我所知,在将日期保存到数据库时以及提取日期时都会使用此TZ。

现在,我必须将datetime对象序列化为ISO字符串,包括UTC偏移量。这样做的正确方法是什么?

日期不包含TZ信息(即d.strftime('%z')为空)

我想我可以将它们转换为UTC并使用+00:00进行序列化,但如果我不知道具体日期是+03(莫斯科冬季)还是+04(莫斯科夏季),如何将它们转换为UTC )

3 个答案:

答案 0 :(得分:5)

  

如果我不知道具体日期是+03(莫斯科冬季)还是+04(莫斯科夏季),如何将它们转换为UTC

不需要UTC转换,pytz会为你处理这样的事情。

以下是从时区初始日期时间转换为带时区偏移的ISO的代码:

from datetime import datetime
from pytz import timezone

server_timezone = timezone('Europe/Moscow')

server_timezone.localize(datetime(2011, 1, 1)).isoformat()
>>> '2011-01-01T00:00:00+03:00'

server_timezone.localize(datetime(2011, 7, 1)).isoformat()
>>> '2011-07-01T00:00:00+04:00'

答案 1 :(得分:3)

首先运行new_dt = datetime.replace(tzinfo=tz)以创建新的时区感知datetime。然后使用datetime.strftime()运行%z

请注意,您无法直接将日期字符串转换回时区感知日期时间 - datetime.strptime()不支持%z。因此,您需要创建一个天真的datetimetzinfo,然后像以前一样创建datetime.replace(tzinfo=tz)

一些有用的外部库:

http://pytz.sourceforge.net/

http://code.google.com/p/parsedatetime/

http://labix.org/python-dateutil

还可以尝试在Stack Overflow上搜索更多关于(Python或django或appengine)AND(日期时间或时区或日期或时间或tzinfo)的问题。

答案 2 :(得分:1)

ISO-8601没有“时区”的概念,只有日期和时间,为方便起见,时间可能会带有“偏移”。

为了让事情变得更加烦人,datetime只有半心半意地承认时区; datetime对象的tzinfo属性是可选的,主线python不提供该接口的实现。

对此的标准答案是始终用UTC做所有事情;包括服务器的UTC,而不是当地时间。这实际上是个好主意;这不是时间的不同,只是个人用户喜欢阅读的时间(类似于'0'优先于'0b101010')。

您可以通过将实际时间与实际时间分开存储首选时区(可能只是每个人都在莫斯科的网站范围偏好)来满足您的用户(合理!)在当地时区查看时间的愿望,然后您可以使用强大的时区库(如pytz),可以在本地时间进行格式化。