很多人掉进了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]的更多相关文章

  1. odoo 的时差 坑

    很多人掉进了odoo的时间坑     odoo约定关于日期的数据,存放在数据库时,以 utc0 时区也就是不带时区 存放,应用程序读取日期展示日期时, 转换成用户的时区展示     例如,stock ...

  2. Feign发送Get请求时,采用POJO对象传递参数的最终解决方案 Request method 'POST' not supported (附带其余好几个坑)

    yml: feign: httpclient: enabled: true properties: #feign feign.httpclient.enabled=true <!-- https ...

  3. 8.0/9.0 Email 设置

    Email 设置一直都是Odoo的一个坑,巨坑. 先讲结论,发邮件可以用,收还是算了吧 1. 发邮件设置 发的设置相对简单,如果企业邮箱支持catcll all功能,基本不用改动可以直接用,否则需要安 ...

  4. Odoo “坑” 系列之 XML中的布尔类型

    在Odoo中试图通过XML方式更新某条Record的值,却意外发现根本不能更新,经查,对于XML中Boolean类型的字段,更新的方式应该采用eval的方式.

  5. odoo开发笔记--日期or时间字段给定默认值

    开发中经常有这样的场景,需要给某个日期或者时间的字段默认值: 例如: 日期,默认今天 时间,默认当前时间 可以在odoo模型定义中进行设置, 如下样例提供参考: test_data = fields. ...

  6. 整理iOS9适配中出现的坑(图文)

    原文: http://www.cnblogs.com/dsxniubility/p/4821184.html 整理iOS9适配中出现的坑(图文)   本文主要是说一些iOS9适配中出现的坑,如果只是要 ...

  7. Kafka 0.9+Zookeeper3.4.6集群搭建、配置,新Client API的使用要点,高可用性测试,以及各种坑 (转载)

    Kafka 0.9版本对java client的api做出了较大调整,本文主要总结了Kafka 0.9在集群搭建.高可用性.新API方面的相关过程和细节,以及本人在安装调试过程中踩出的各种坑. 关于K ...

  8. bootstrap-table填坑之旅<一>认识bootstrap-table

    应公司需求,改版公司ERP的数据显示样式.由于前期开发的样式是bootstrap,所以选bootstrap-table理所当然(也是因为看了bootstrap-table官网的example功能强大, ...

  9. 整理 iOS 9 适配中出现的坑(图文)(转)

    作者:董铂然 本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iOS9正式版,随着 ...

随机推荐

  1. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it

    链接:https://www.nowcoder.com/acm/contest/163/F 来源:牛客网 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it 时间限制:C ...

  2. 【转】深入理解JVM—JVM内存模型

    http://www.cnblogs.com/dingyingsi/p/3760447.html#3497199 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU ...

  3. VirtualBox Host-only Adapter,Failed to create the host-only adapter 转

    不用重装VirtualBox,安装虚拟网卡 今天使用VirtualBox的host-only模式,因为之前把网络连接卸载,这次出现的各种错误. Failed to create the host-on ...

  4. mybatis分页方式对比

    mybatis有两种分页方法(转自:http://blog.csdn.net/leozhou13/article/details/50394242) 1.内存分页,也就是假分页.本质是查出所有的数据然 ...

  5. 【bzoj1283】序列 线性规划与费用流

    题目描述 给出一个长度为 的正整数序列Ci,求一个子序列,使得原序列中任意长度为 的子串中被选出的元素不超过K(K,M<=100) 个,并且选出的元素之和最大. 输入 第1行三个数N,m,k. ...

  6. best coder #35-01<组合数学 || 概率数学>

    问题描述 一个盒子里有n个黑球和m个白球.现在DZY每次随机从盒子里取走一个球,取了n+m次后,刚好取完.DZY用这种奇怪的方法生成了一个随机的01串S[1⋯(n+m)].如果DZY第i次取出的球是黑 ...

  7. 如何查找Windows上安装的DB2的端口号Port

    1.db2com打开控制台 2.db2 get dbm cfg 可以通过db2 get dbm cfg,查询数据库管理器配置参数,就可以查到端口号或端口名. 示例: $ db2 get dbm cfg ...

  8. [暑假集训--数位dp]UESTC250 windy数

    windy定义了一种windy数. 不含前导零且相邻两个数字之差至少为22 的正整数被称为windy数. windy想知道,在AA 和BB 之间,包括AA 和BB ,总共有多少个windy数? Inp ...

  9. vue-cli3 vue.config.js配置

    module.exports = { // 基本路径 baseUrl: '', // 输出文件目录 outputDir: 'dist', // eslint-loader 是否在保存的时候检查 lin ...

  10. php 爬取网页列表 QueryList

    主流的方式是 phpQuery 今天使用了 QueryList,是在PHPQuery的基础上进行了封装,现在最新的版本是4.0,但是要求PHP>7.0.就用了旧版的3.0 3.0文档:https ...