对时区感到困惑,dateutil.parser.parse?

时间:2016-03-12 02:22:41

标签: django postgresql timezone

我有一个变量:data_datetime = dateutil.parser.parse(data['datetime'])
我把它打印出来,它是2016-03-12 01:49:43.082514+00:00
我保存到数据库中:obj.update_time = data_datetime

但是数据库的时间错了,它保存2016-03-12 01:49:43.082514+08(它增加了8个小时的时区)
它应该保存2016-03-12 01:49:43.082514+00:002016-03-12 09:49:43.082514+08

我感到非常困惑。如何将正确的时间保存到数据库中???

我再试一次current_utc_time = datetime.datetime.now(pytz.utc)
我把它打印出来:2016-03-12 02:01:58.631653+00:00
当它保存到数据库obj.update(id=id,update_time=current_utc_time) 它节省了我想要的正确时间:2016-03-12 10:01:58.364853+08

我不知道为什么data_datetime = dateutil.parser.parse(data['datetime'])无法保存正确的时间 请帮帮我,谢谢

我发现了一个区别:一个是使用obj.update_time = data_datetime,另一个是使用obj.update(id=id,update_time=current_utc_time)
如果是根本原因,我怎样才能保存我想要的合适时间?

1 个答案:

答案 0 :(得分:0)

当你从Python datetime对象开始时,它会被正确地序列化到数据库中。当您从数据库datetime对象往返,解析为Python对象,然后将它们序列化后,时区就会被破坏。解析函数(https://dateutil.readthedocs.org/en/latest/parser.html#dateutil.parser.parse)的dateutil包文档讨论了ignoretz以及tzinfos参数,以及它将对时区进行天真猜测的事实。再加上这些文档中的所有示例都显示两位数的时区偏移量,我猜你需要在解析的字符串中用00 00替换00:00。或者,以某种方式使用tzinfos参数将ISO8601时区偏移样式映射到UTC时区,以便解析器不会对无法解析的数据进行不正确的猜测。