Python - 将朴素日期时间转换为UTC

3 投票
1 回答
6549 浏览
提问于 2025-04-18 16:39

我有一个时间,它是在特定时区下得到的,但系统把它当作UTC时间来处理,然后再转换回那个时区,这样就搞乱了时间。

举个例子:

我得到这个时间:2014-05-05 10:50:30。这是一个日期时间对象。它没有时区信息,但我可以从使用这个时间的用户那里获取时区信息。问题是,这个时间是以“欧洲/维尔纽斯”时间显示的,但系统把它当作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 个回答

2

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

Odoo - 将日期时间转换为UTC时间:

(注意:在这个例子中,self.start_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)是日期字段,所以不受时区的影响,而目标存储的字段是日期时间字段,因此存储为UTC时间。

现在在UTC时间下的start_date和end_date可以用在self.env[''].search([])中。

撰写回答