• 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
  • 相关阅读:
    Bootstrap 2.2.2 的新特性
    Apache POI 3.9 发布,性能显著提升
    SQL Relay 0.48 发布,数据库中继器
    ProjectForge 4.2.0 发布,项目管理系统
    红帽企业 Linux 发布 6.4 Beta 版本
    红薯 快速的 MySQL 本地和远程密码破解
    MariaDB 宣布成立基金会
    Percona XtraBackup 2.0.4 发布
    Rocks 6.1 发布,光盘机群解决方案
    精通Servlet研究,HttpServlet的实现追究
  • 原文地址:https://www.cnblogs.com/odoouse/p/5502132.html
Copyright © 2020-2023  润新知