odoo 9 中的时区

Timezone in odoo 9

连接日期和时间字段后,放入新日期时间字段的结果比必要时间多 2 小时

示例:

date = fields.Date(string = 'date', select=True)
time = fields.Many2one('period.time', string='Available time',select=True)
date_time = fields.Datetime(string='Datetime', compute="_compute")
description = fields.Char(string = 'Descroption', compute="_compute")

@api.onchange('date', 'time') #time is 08:00:00
def _compute(self):
    self.date_time = "%s %s:00" % (self.date,self.time.name)
    self.description = "%s %s:00" % (self.date,self.time.name)

date_time(日期时间)2017-04-10 10:00:00 --> 错误

描述(字符)2017-04-10 08:00:00 --> 正确

如何解决这个问题?

这在 odoo 方面没有错,因为 odoo 在 UTC.When 中保存日期,用户请求日期 odoo 将日期从数据库转换为用户的时区。

因此,如果您转到数据库,您会发现该字段已存储 date = 2017-04-10 08:00:00 但在视图中,日期已转换为用户的时区,在您的情况下已转换为 2017-04-10 10:00:00

所以在保存日期之前确保将值转换为 UTC 日期时间我的意思是不要将 2017-04-10 08:00:00 保存到 date_time 但保存 2017-04-10 06:00:00

编辑: 试试这个我希望它能工作 id 没有使用它但我认为如果有任何错误就把它放在这里它会工作:

# first import 
from datetime import datetime
import pytz

class ...
    ...
    date = fields.Date(string = 'date', select=True)
    time = fields.Many2one('period.time', string='Available time',select=True)
    date_time = fields.Datetime(string='Datetime', compute="_compute")
    description = fields.Char(string = 'Descroption', compute="_compute")
    ...
    ...

    @api.onchange('date', 'time') #time is 08:00:00
    def _compute(self):
        # by default timezone = UTC
        user_time_zone = pytz.UTC

        if self.env.user.partner_id.tz :
            # change the timezone to the timezone of the user
            user_time_zone = pytz.timezone(self.env.user.partner_id.tz)

        # create time string
        concat_time = "%s %s:00" % (self.date,self.time.name)
        fmt = '%Y-%m-%d %H:%M:%S'

        # create a time object
        user_time = datetime.strptime(concat_time, fmt)

        # define the timezone of the time object
        # here i think the first line is enougth
        user_time = user_time_zone.localize(user_time)
        user_time.replace(tzinfo=user_time_zone)

        # you can get the time in UTC like this 
        print "This is what you need to save in database %s ", user_time.astimezone(pytz.UTC).strftime(fmt)

        self.date_time = user_time.astimezone(pytz.UTC).strftime(fmt)

在odoo class datetime你可以找到用于class Datetime的方法,

def context_timestamp(record, timestamp):

您可以使用此方法将 UTC 中的 Datetime 转换为用户的时间戳。

您需要导入这 2 个包

import datetime as DT
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT as DF

然后再做这个。

date = fields.Date(string = 'date', select=True)
time = fields.Many2one('period.time', string='Available time',select=True)
date_time = fields.Datetime(string='Datetime', compute="_compute")
description = fields.Char(string = 'Descroption', compute="_compute")

@api.onchange('date', 'time') #time is 08:00:00
def _compute(self):
       date_utc = DT.datetime.strptime(self.date, DF)
       date_tz = fields.Datetime.context_timestamp(self, date_utc)
       self.description = date_tz.strftime(DF)