Odoo timezone时差调整 方法 时区调整

文章最后更新于2023-05-17

by itgeeker.net

最近在开发Odoo整合VOIP电话(供应商称为云电话)到奇客大师(GeekerMaster)系统时,返回的log说是时间戳错误。供应商说每次post的url的时效性是1分钟,检查发现后,我们每次发送Post请求的时候都会重新产生一遍,应该不存在时间过期的问题。

用 _logger.warning打印变量值,发现Odoo服务器发送post的时间和我们当前Asia/Shanghai时区的时间是不同的,比当前电脑时间早了8个小时。而在系统端用date查询时间是正确的。应该是Odoo系统采用UTC时间的问题。

Odoo系统前端页面显示是当前时区的时间,视图渲染时对datetime类型的字段做了时区调整,但后台数据库记录用的是UTC时间,并没有做时区调整,据说这是解决全球性使用一个系统的时间差问题的最好方法。

这次ITGeeker技术奇客碰到的问题是国内的云电话供应商用的是北京时间UTC+8时区(Asia/Shanghai),所以只好调整代码来解决这个问题了。

Odoo调整时差方法一 timedelta(hours=8)

直接加8个小时,直观又方便。后面的时间格式根据要求可以更改。

import datetime
from datetime import timedelta

now = (datetime.datetime.now() + timedelta(hours=8)).strftime("%Y%m%d%H%M%S")

Odoo调整时差方法二 pytz

import datetime
import pytz

user_tz = self.env.user.tz
# local_tz = pytz.timezone(user_tz)
now = datetime.datetime.now(pytz.timezone(
            user_tz)).strftime("%Y%m%d%H%M%S")

Odoo要在”首选项”配置里设置好自己的时区为Asia/Shanghai,否则无法读取到您当前的时区。

Odoo调整时差方法三 dpkg-reconfigure tzdata

服务器端,例如Ubuntu使用 dpkg-reconfigure tzdata 设置时区,设置为UTC时区,使得您当前的时间和UTC时间一致。

这里有个小提示: strftime和 strptime是不同的,一个是输出显示时间的样式,后者是输出时间的格式。

ITGeeker技术奇客最近也调试了阿里云的短信,阿里用的时间格式就和时差无关,用的GMT时间。分享一下用python实现阿里短信所需要的时间格式:

import time

now = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())

UTC确立以后UTC(GMT)=UTC(+0)作为一般提到的世界时,GMT表示零时区的时刻。 … 格林威治时间(GMT)是一个比较模糊的概念。 在1928年,GMT就是世界时。 在UTC被广泛采用后,我们提到的GMT实际上是UTC时间,或者说零时区的标准时。

所以说用UTC是最好的解决方案。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

奇客罗方公众号 奇客罗方小程序 奇客罗方客服 ITGeeker Telegram

网站由ITGeeker技术奇客开发并管理;隶属于GeekerCloud奇客罗方智能科技
Site designed and developed by ITGeekerwhich is a sub-website of GeekerCloud
网站地图 | 沪ICP备2021031434号-4