
Odoo中文社区可以通过以下两个域名访问:shine-it.net , odoo.net.cn
由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解
本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!
开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号
如果您登录系统碰到问题,请在微信公众号留言:
odoo11.0时间差问题,求不更改源代码的解决方式
-
odoo11.0中,fields.Datetime(),存储到数据库中是格林威治时间,如何不更改odoo源代码,在存储时,存成utc本地时间……
-
@皓羽如风 在 odoo11.0时间差问题,求不更改源代码的解决方式 中说:
fields.Datetime(),存储到数据库中是格林威治时间,如何不更改odoo源代码,在存储时,存成utc本地时间……
这是odoo对多时区用户的专门的设定,存到数据库中的数据统一是零时区,到取用数据的时候根据用户实际的时区再动态的显示时间。如果存进数据中的是utc本地,就不能适用多时区。不改源码是不行的,
-
不改代码目前不可能,
因为代码里往数据库存时间的地方写死了utc 时间,
再怎么调整配置也绕不过去
-
@皓羽如风 正如上面两位兄台所说,这是一个设计,并非bug。为什么要修改成本地时间?
修改成哪里的本地时间合适呢?操作者的本地时间?服务器的本地时间? -
主要是现在有些企业其实用不到多时区这个功能,
基本上utc +8 就可以了;
odoo 本身的时区处理本身没有问题,
但会导致二次开发的时候所有和时间有关的业务逻辑不走框架的话就要考虑时区转换的问题,
不然容易产生8小时误差
-
例如在和别的系统对接的时候,
传过来的时间是不能直接拿来用的,
不做时区处理会有时差问题
-
@digitalsatori
确实并非bug,我能理解他的设计,但是在二次开发的时候,我觉得修改贸然修改源码并不合适,可是如果数据库中直接存储的就是零时区的时间,会出现很多问题,如@Siyuan 所说。所以不能只根据现在的需要在获取到的时间上直接处理,应该从数据库中存储的数据上做调整啊
所以才想求解各位如何做的处理,我不太会处理 -
@静静
动态显示时间?这个我理解,那如何再将数据库中时间动态显示成本地时间呢,这种存储用零时区,可是对取出来的过程不做处理不太合理啊,你是怎么处理的? -
对于多时区这个功能,
数据库里存任何时区其实都是无所谓的;
odoo 目前的做法是:保存到数据库里的是 utc 时间,
所有时间的处理都以utc时间为基础、再进行转换;
如果保存到数据库的时间: 例如是 uct +8,
那么只要将框架所有原来:utc时间为基础、再进行转换 的地方换成:
utc +8 时间为基础、再进行转换;
这样多时区功能照样是可以用的;
说到底就是要保证: 输入、读取用的都是一套时区,
不能只改一部分;
目前odoo 源代码里是写死了 输入、读取都是 utc,
如果将输入 改成别的时区,那么读取也要改着改,
不然就会又时差问题
-
-
@siyuan 在 odoo11.0时间差问题,求不更改源代码的解决方式 中说:
主要是现在有些企业其实用不到多时区这个功能,
基本上utc +8 就可以了;
odoo 本身的时区处理本身没有问题,
但会导致二次开发的时候所有和时间有关的业务逻辑不走框架的话就要考虑时区转换的问题,
不然容易产生8小时误差
只要有时区设置,它就是一个相对动态的概念。你说得这种应用场景,与其去将Odoo数据库的UTC时间改为UTC+8,为什么不直接在调用时做时区转换呢?
完整的时区支持其实考虑的因素很多,有一定的复杂性,Odoo在这方面实现的还算不错的。 -
@siyuan 在 odoo11.0时间差问题,求不更改源代码的解决方式 中说:
相信我,如果你二次开发遇到大量时间方面的处理,
改源代码一劳永逸
@Siyuan 他好象是在Odoo内做二次开发
@皓羽如风 能告诉我们为什么你觉得有必要修改保存在数据库的时间为本地时间,能讲一个应用场景吗? -
主要是在面临大量时间数据处理的时候,
每次都处理时区会比较麻烦,
也可能会遗漏、出问题;
当然“在调用时做时区转换” 也是种正确的解决方案。
odoo 时区方案的解决方案无非以下两种,
-
将框架里 utc 保存、读取的所有逻辑换成你常用的时区:例如cct (utc +8)
-
在时间处理的地方自己考虑时区问题
至于最后用哪种方案就要看具体业务需求了,
谈不上哪种方案好、哪种方案不好
-
-
最简单:例如你抓大量淘宝数据,
抓到的时间都是 utc +8 时间,
在考虑性能、通过sql语句直接存数据库的情况下,
抓到的时间都是要处理时区的,
不能直接就保存到数据库里。
-
@digitalsatori @Siyuan 谢谢,我问题暂时解决了,你的问题我再考虑一下。刚刚我又有了其他想法。