odoo时间的处理?
-
关于odoo处理时间的机制,对以下现象感到困惑:
测试一:
如果在odoo的python代码中,以下代码
datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
会产生utc时间(不带时区的),结果跟datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')是完全一样的!测试二:
如果在同一台机器的python终端上运行datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),却会产生一个带时区的本地时间(结果比上面的增加8小时)
同样的python内置的datetime,为什么产生不一样的结果?odoo中间做了什么处理了吗?另外,上面是的测试时在linux(debian)下。如果在windows中,现象跟上述不一样。
测试一和测试二产生的时间是一致的,结果都是带时区的时间。
========================EDIT=======================
受到以下文章的启发:
http://radzhang.iteye.com/blog/2328612
原来,在odoo/__init__.py
初始化时做了个“时区hack”,将系统环境的时区设置成了'UTC',经这一处理后,上述测试的现象和结果就能解释通了。并且经过这么处理后,在odoo代码中使用datetime.datetime.now()和datetime.datetime.utcnow()是完全一样的效果,不用纠结用哪一个。需要注意odoo/__init__.py
中的“时区hack”仅对linux环境起作用。至于在windows中的现象,其实在最新的odoo版本中,通过命令行启动的odoo实例也能实现上述的“时区hack”,但是在
Windows的IDE
(比如eclipse)中,odoo官方好像还没有解决的方法来实现这种“时区hack”。具体说法可以参考github中odoo/__init__.py
的comments(https://github.com/odoo/odoo/commit/07bf7bf4f3af49f18a06000ef50ef90d8ad90224 ) -
谢谢分享 :aplauso:
我顺便贴下代码:
odoo/__init__.py
这个是用于unix系统#---------------------------------------------------------- # libc UTC hack #---------------------------------------------------------- # Make sure the OpenERP server runs in UTC. import os os.environ['TZ'] = 'UTC' # Set the timezone import time if hasattr(time, 'tzset'): time.tzset()
odoo-bin
这部分用于windows系统,因为在windows里通过修改环境变量来使time
的时区改变必须在time
模块被import
前。__import__('os').environ['TZ'] = 'UTC'