如何在python中获取除服务器时区(UTC)以外的用户本地时区?

时间:2012-11-20 12:24:34

标签: python datetime openerp

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

4 个答案:

答案 0 :(得分:11)

知道了。

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/

答案 1 :(得分:3)

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

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

这就是报告引擎为此提供实用方法的原因:报告上下文中提供的formatLang()方法(至少基于RML的方法)将根据用户的时区格式化日期如果你用日期时间值和date_time=True调用它(它使用RPC调用中传递的tz上下文变量并基于用户的时区首选项) 您可以在官方插件中找到如何使用它的示例,例如delivery module (l.171)

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

[1]:请参阅OpenERP implementation,此6.1 release notes,以及other questionbug 918257上的评论#4。

答案 2 :(得分: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)

答案 3 :(得分:0)

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

转换为用户的时区:

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

删除偏移量:

LocalizedDate = LocalizedDate.replace(tzinfo=None)