在OpenERP中,当我尝试打印当前日期和时间时,它总是打印出“UTC”时间。但我想获取用户时区的时间。每个用户都有不同的时区。例如'CST6CDT'、'US/Pacific'或'Asia/Calcutta'。因此,我需要获取用户时区的时间,以便在报告中显示正确的日期时间。我尝试使用datetime模块中的localize()和replace()函数来更改时区,但我没有得到正确的输出结果。
明白了。
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/
formatLang()
方法(至少基于RML的报告)将根据用户的时区偏好格式化日期,如果您使用日期时间值和date_time=True
调用它(它使用在RPC调用中传递的tz
上下文变量,并基于用户的时区偏好)。您可以在官方插件中找到如何使用此方法的示例,例如在delivery module (l.171)中。
如果您想了解formatLang()
的实际转换方法,请查看实现。
来自: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)
DateInUTC = <~ 需要转换的时间变量
将其转换为用户所在时区:
LocalizedDate = fields.datetime.context_timestamp(cr, uid, DateInUTC, context=context)
移除偏移量:
LocalizedDate = LocalizedDate.replace(tzinfo=None)