所以,我们的设置中有'Europe / Moscow'TZ。 目前这意味着夏令时(这将在未来发生变化,但目前是UTC + 03/04)。
据我所知,在将日期保存到数据库时以及提取日期时都会使用此TZ。
现在,我必须将datetime对象序列化为ISO字符串,包括UTC偏移量。这样做的正确方法是什么?
日期不包含TZ信息(即d.strftime('%z')为空)
我想我可以将它们转换为UTC并使用+00:00进行序列化,但如果我不知道具体日期是+03(莫斯科冬季)还是+04(莫斯科夏季),如何将它们转换为UTC )
答案 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
。因此,您需要创建一个天真的datetime
和tzinfo
,然后像以前一样创建datetime.replace(tzinfo=tz)
。
一些有用的外部库:
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),可以在本地时间进行格式化。