9

在 OpenERP 中,当我尝试打印当前日期和时间时,它总是打印“UTC”时间。但我想在用户时区获得时间。每个用户都有不同的时区。For example 'CST6CDT',“美国/太平洋”或“亚洲/加尔各答”。所以我需要在用户时区获取时间,以便我可以在报告中显示正确的日期时间。我尝试使用 datatime 模块中的 localize() 和 replace() 函数更改时区。但我没有得到正确的输出。

4

4 回答 4

12

知道了。

from datetime import datetime
from pytz import timezone

fmt = "%Y-%m-%d %H:%M:%S"

# Current time in UTC
now_utc = datetime.now(timezone('UTC'))
print now_utc.strftime(fmt)

# Convert to US/Pacific time zone
now_pacific = now_utc.astimezone(timezone('US/Pacific'))
print now_pacific.strftime(fmt)

# Convert to Europe/Berlin time zone
now_berlin = now_pacific.astimezone(timezone('Europe/Berlin'))
print now_berlin.strftime(fmt)

礼貌: http: //www.saltycrane.com/blog/2009/05/converting-time-zones-datetime-objects-python/

于 2012-11-20T12:34:14.003 回答
5

从 OpenERP 6.1 开始,发生在服务器端(和模块中)的所有 Python 操作的时区都强制为 UTC。这是在不同地方解释的设计决策[1]。用户时区中日期时间值的呈现意味着仅在客户端完成。

在服务器端使用用户的时区而不是 UTC 的情况很少,但确实在报告中打印日期时间值就是其中之一,因为客户端将没有机会转换结果报告。

这就是为什么报告引擎为此提供了一种实用方法:在formatLang()报告上下文中提供的方法(至少基于 RML 的方法)将根据用户的时区格式化日期,如果您使用日期时间值调用它并使用date_time=True(它使用tz在 RPC 调用中传递的上下文变量并基于用户的时区偏好)您可以找到如何在官方插件中使用它的示例,例如在交付模块 (l.171)中。

如果您想知道它实际上是如何进行转换的,请查看实现。formatLang()

[1]:请参阅 OpenERP 6.1 发行说明、this other question,以及关于bug 918257bug 925361的评论 #4 。

于 2012-11-20T13:53:48.357 回答
0

来自:http ://help.openerp.com/question/30906/how-to-get-users-timezone-for-python/

DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"

import pytz
from openerp import SUPERUSER_ID

# get user's timezone
user_pool = self.pool.get('res.users')
user = user_pool.browse(cr, SUPERUSER_ID, uid)
tz = pytz.timezone(user.context_tz) or pytz.utc

# get localized dates
localized_datetime = pytz.utc.localize(datetime.datetime.strptime(utc_datetime,DATETIME_FORMAT)).astimezone(tz)
于 2013-10-07T05:42:39.927 回答
0

DateInUTC = <~ 要转换的时间变量

要转换为用户的时区:

LocalizedDate = fields.datetime.context_timestamp(cr, uid, DateInUTC, context=context)

要删除偏移量:

LocalizedDate = LocalizedDate.replace(tzinfo=None)
于 2014-06-30T07:57:27.680 回答