Python - 将本地时间转换为UTC

3
我有一个具体时区时间的日期数据,但系统将其视为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。 如果时区是“Europe / Vilnius”,则应将该时间转换为2014-05-05 07:50:30。 然后当系统自动进行转换时,它将正确显示2014-05-05 10:50:30,因为这是应该显示的时间。

如果有一种方法只获得特定时区与UTC之间的小时数,那么我只需要:

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


这个真是救了我们的一天 - https://dev59.com/lXVD5IYBdhLWcg3wHn2d - Andrius
1个回答

2

虽然这个问题并没有特别提到Odoo,但是希望以下内容能够帮助其他人:

Odoo - 将日期时间转换为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([])中使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接