odoo 的时差 坑 [updated]
很多人掉进了odoo的时间坑
odoo约定关于日期的数据,存放在数据库时,以 utc0 时区也就是不带时区存放,应用程序读取日期展示日期时,转换成用户的时区展示。用户的时区通过context传递。
odoo本身能很好的处理 这, 例如 每个模型都自带的 create_date / write_date
代码
它在处理这些的时候,会 使用 utc-0 时区 存数据库。
在 web client 以及 其他界面 展示这些日期 信息时, 能 根据用户的 时区, 例如 上海时区 【东8区】
如果用户的时区 切换到 其他, 例如 fiji [ utc-12 区] 与 上海时间 相差 4小时。
展示的时间 为 当地时间, 在上海时间基础上 加 4小时, 所以是 5/13 01:46
而订单存放数据库的 时间是 utc-0
但是 某些应用 在往数据库存 这些时间的时候, 有的没有处理好。
例如,stock picking 的字段 date_done是分拣完成时的日期,分拣完成时读取系统时间,此时本应该转换为 utc-0 并写入数据库作为 date_done.. 的数据
但是 odoo sa的程序员在写这个逻辑的时候,并没有转换为utc-0
代码
self.write(cr, uid, [picking.id], {'date_done': time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)}, context=context)
time.strftime() 读取odoo服务器的当前时间【带时区】,如果服务器运行在 utc-8 ,则数据库存的日期也是 with utc-8,也就是下图示的前 2笔交易[ id = 15, 16]
这样,当用户从应用程序读取改数据时,在此数据基础上 +时差,变成了。
造成时差 8 小时
原因是, odoo代码里面的相关日期处理是不正确的,没有遵循在存数据前去掉时区信息。
要解决这个问题, 2个 方式
1, 遵守约定,存数据库时使用 utc-0
例如 stock 有问题部分的代码修改,已经提交 PR [ https://github.com/odoo/odoo/pull/12063 ]
@@ -506,7 +506,7 @@ def _quant_create(self, cr, uid, qty, move, lot_id=False, owner_id=False, src_pa
'qty': float_round(qty, precision_rounding=rounding),
'cost': price_unit,
'history_ids': [(4, move.id)],
- 'in_date': datetime.now().strftime(DEFAULT_SERVER_DATETIME_FORMAT),
+ 'in_date': datetime.utcnow().strftime(DEFAULT_SERVER_DATETIME_FORMAT),
'company_id': move.company_id.id,
'lot_id': lot_id,
'owner_id': owner_id,
2, 使用workaround 解决此问题,那就是将 odoo 服务器的时区设置为 utc -0
使用 dpkg-reconfigure tzdata 设置时区
设置为 utc-0 之后的测试
服务器设置为 utc-0 之后, datetime.datetime.now() 和 datetime.datetime.utcnow() 以及 time 获取的时间都是不带时区信息,这样就能避免时差问题。
odoo 的时差 坑 [updated]的更多相关文章
- odoo 的时差 坑
很多人掉进了odoo的时间坑 odoo约定关于日期的数据,存放在数据库时,以 utc0 时区也就是不带时区 存放,应用程序读取日期展示日期时, 转换成用户的时区展示 例如,stock ...
- Feign发送Get请求时,采用POJO对象传递参数的最终解决方案 Request method 'POST' not supported (附带其余好几个坑)
yml: feign: httpclient: enabled: true properties: #feign feign.httpclient.enabled=true <!-- https ...
- 8.0/9.0 Email 设置
Email 设置一直都是Odoo的一个坑,巨坑. 先讲结论,发邮件可以用,收还是算了吧 1. 发邮件设置 发的设置相对简单,如果企业邮箱支持catcll all功能,基本不用改动可以直接用,否则需要安 ...
- Odoo “坑” 系列之 XML中的布尔类型
在Odoo中试图通过XML方式更新某条Record的值,却意外发现根本不能更新,经查,对于XML中Boolean类型的字段,更新的方式应该采用eval的方式.
- odoo开发笔记--日期or时间字段给定默认值
开发中经常有这样的场景,需要给某个日期或者时间的字段默认值: 例如: 日期,默认今天 时间,默认当前时间 可以在odoo模型定义中进行设置, 如下样例提供参考: test_data = fields. ...
- 整理iOS9适配中出现的坑(图文)
原文: http://www.cnblogs.com/dsxniubility/p/4821184.html 整理iOS9适配中出现的坑(图文) 本文主要是说一些iOS9适配中出现的坑,如果只是要 ...
- Kafka 0.9+Zookeeper3.4.6集群搭建、配置,新Client API的使用要点,高可用性测试,以及各种坑 (转载)
Kafka 0.9版本对java client的api做出了较大调整,本文主要总结了Kafka 0.9在集群搭建.高可用性.新API方面的相关过程和细节,以及本人在安装调试过程中踩出的各种坑. 关于K ...
- bootstrap-table填坑之旅<一>认识bootstrap-table
应公司需求,改版公司ERP的数据显示样式.由于前期开发的样式是bootstrap,所以选bootstrap-table理所当然(也是因为看了bootstrap-table官网的example功能强大, ...
- 整理 iOS 9 适配中出现的坑(图文)(转)
作者:董铂然 本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iOS9正式版,随着 ...
随机推荐
- iOS-----openGL--openGL ES iOS 入门篇4---> 离屏渲染
http://www.cnblogs.com/CoderAlex/p/6604618.html 通常情况下,我们使用openGL将渲染好的图片绘制到屏幕上,但有时候我们不想显示处理结果,这时候就需要使 ...
- HDU——1003Max Sum(子序列最大和)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- CentOS7 修改时区、charset
1. 修改时区 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 经过这番修改后,JAVA启动后自动使用了Shanghai作为时区. 2. ...
- angular关于依赖注入
<html> <head> <title>Angular JS Forms</title> </head> <body> < ...
- H264格式(转)
名词解释 场和帧 : 视频的一场或一帧可用来产生一个编码图像.在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场. 片 : 每个图象中,若干宏块被排列成片的形式.片分为 ...
- 转 如何在C++中调用C程序
如何在C++中调用C程序? C++和C是两种完全不同的编译链接处理方式,如果直接在C++里面调用C函数,会找不到函数体,报链接错误.要解决这个问题,就要在 C++文件里面显示声明一下哪些函数是C写 ...
- MAMP 10.10下启动报错解决方案
cd /Applications/MAMP/Library/binmv envvars _envvars
- configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.
configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+. 一.错误发生情景: 在安装gcc时,执行.c ...
- ZOJ 2619: Generator
类型:概率 + 解方程组(高斯消元法) + KMP(好吧其实我用的是暴力~)题意:你可以等概率的选择大写字母里的前n个字母,在纸上写啊写,一直到出现给定的字符串.问写的字母个数的期望.思路: 期望递推 ...
- 微信小程序之微信支付C#后台(统一下单)
一.微信小程序支付 1.微信小程序端请求支付接口 商户在小程序中先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易后调起支付.具体可以查看接口示例. 接口传入参数示例: <xm ...