Python - 将天真的日期时间转换为UTC

时间:2014-08-09 12:18:55

标签: python datetime timezone openerp odoo

我有特定时区时间的日期,但系统将其作为UTC处理,稍后将其转换回该时区,弄乱时间。

例如:

我得到这个时间:2014-05-05 10:50:30。它的日期时间对象。它没有时区信息,但我可以从使用该时间的用户获取时区信息。事情是这个时候被展示为' Europe / Vilnius'时间,但系统将其作为UTC处理,当它向用户输出时间时,它会增加+3小时显示错误的时间。如果我在该日期时间对象上将时区更改为用户时区并不重要,它仍会以+3小时输出。

例如(代码片段):

from datetime import datetime
import pytz         
create_date = datetime.strptime(stage_log.create_date, "%Y-%m-%d %H:%M:%S")
tz = pytz.timezone(self.user_id.tz)
create_date = create_date.replace(tzinfo=pytz.utc)

这没有做任何事情,我仍然错误的时间。

有没有办法将时间移动到正确的UTC时间(以便系统正确转换为用户时区),如下所示:

2014-05-05 10:50:30 - >转换为UTC。如果时区是“欧洲/维尔纽斯”,则应将该时间转换为2014-05-05 07:50:30。然后,当系统自动进行转换时,它会正确显示2014-05-05 10:50:30,因为它应显示的时间。

此外,如果有一种方法可以获得给定时区与UTC不同的小时数,那么我可以这么简单:

create_date.replace(hour=create_date.hour-timezone_difference)

1 个答案:

答案 0 :(得分:0)

虽然这个问题没有具体参考odoo,但希望以下内容可以帮助其他人:

Odoo - 将datetime转换为UTC: (注意:在此示例中,self.start_date是fields.Date)

start_date = fields.Datetime.to_string(pytz.timezone(self.env.context['tz']).localize(fields.Datetime.from_string(self.start_date), is_dst=None).astimezone(pytz.utc))

类似但是+24小时

end_date = fields.Datetime.to_string(pytz.timezone(self.env.context['tz']).localize(fields.Datetime.from_string(self.end_date), is_dst=None).astimezone(pytz.utc) + timedelta(hours=24))

使用它是因为传递的值(self.start_date)是field.Date,因此不会受到时区的影响,而目标存储的字段是fields.Datetime,因此存储在UTC中。

现在使用UTC的

start_date / end_date可用于self.env ['']。search([])