2

我有我在特定时区时间获得的日期,但系统将其作为 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)

4

1 回答 1

0

虽然这个问题没有特别提到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)是field.Date,因此不受时区的影响,而目标存储的字段是fields.Datetime,因此存储在UTC中。

然后可以在 self.env[''].search([]) 中使用现在采用 UTC 的 start_date/end_date

于 2016-11-07T05:56:26.870 回答