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)
连接日期和时间字段后,放入新日期时间字段的结果比必要时间多 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)