我有一个特定时区时间的日期,但系统将其处理为UTC,然后将其转换回该时区,混淆时间。
例如:
这次我得到了:2014-05-05 10:50:30
。它的datetime对象。它没有时区信息,但我可以从使用该时间的用户那里获得时区信息。问题是这个时间显示为"欧洲/维尔纽斯"时间,但系统将其作为UTC处理,当它向用户输出时间时,它会添加+3小时,显示错误的时间。如果我将该datetime对象上的时区更改为用户时区,它仍然输出+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)
虽然这个问题没有特别提到odoo,但希望下面的内容对其他人有所帮助:
Odoo -将日期时间转换为UTC:(注意:在这个例子中self。start_date是一个字段。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)是字段。Date和因此不受时区的影响,而目标存储字段是字段。日期时间,因此存储在UTC。
start_date/end_date现在是UTC格式,可以在self.env["].search([])中使用