zoukankan      html  css  js  c++  java
  • odoo 的时差 坑

    很多人掉进了odoo的时间坑

       

    odoo约定关于日期的数据,存放在数据库时,以 utc0 时区也就是不带时区 存放,应用程序读取日期展示日期时, 转换成用户的时区展示

       

    例如,stock picking 字段 date_done 分拣完成时的 日期, 分拣完成时读取 系统时间,写入数据库 作为 date_done.. 代码是 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笔交易。

       

       

       

    这样, 当用户从应用程序读取改数据时, 在此数据基础上 +时差, 变成了。

       

       

    造成 时差 8 小时

       

       

    原因是, odoo代码里面的相关 日期处理是 不正确的, 没有 遵循 在存数据前去掉 时区信息。

       

    Odoo ORM自身处理是正确的, 参考 代码

       

    但是 某些 应用程序里面 没有 处理正确, 例如 stock

       

    @@ -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,

       

       

    在业务代码里 强制使用 utc-0 时区,能 解决此问题,

       

    也可以 使用workaround 解决此问题, 那就是 odoo 服务器的时区设置为 utc -0

       

    使用 dpkg-reconfigure tzdata 设置 时区

       

       

    设置为 utc-0 之后的 测试

       

       

    服务器设置为 utc-0 之后, datetime.datetime.now() datetime.datetime.utcnow() 以及 time 获取的时间 都是 不带时区信息, 这样 就能 避免时差 问题。

       

       

    转载注明原作者 /by Jeffery
  • 相关阅读:
    路飞学城Python-Day142
    路飞学城Python-Day141
    路飞学城Python-Day140
    路飞学城Python-Day136
    路飞学城Python-Day137
    路飞学城Python-Day117
    java基础知识总结
    Maven
    MySql实现分页查询
    js中的正则表达式入门
  • 原文地址:https://www.cnblogs.com/odoouse/p/5502132.html
Copyright © 2011-2022 走看看