如何在Python中获取用户的本地时区而不是服务器时区(UTC)?

9
在OpenERP中,当我尝试打印当前日期和时间时,它总是打印出“UTC”时间。但我想获取用户时区的时间。每个用户都有不同的时区。例如'CST6CDT'、'US/Pacific'或'Asia/Calcutta'。因此,我需要获取用户时区的时间,以便在报告中显示正确的日期时间。我尝试使用datetime模块中的localize()和replace()函数来更改时区,但我没有得到正确的输出结果。
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/


这是一个如何在纯Python中进行时区转换的示例,但OpenERP有推荐的方法和指南来说明何时使用(请参见我的答案)。 - odony

5
自OpenERP 6.1起,所有在服务器端(和模块中)发生的Python操作的时区都被强制设为UTC。这是一个设计决策,在各个地方都有解释。在用户的时区中呈现日期时间值仅应在客户端上执行。有极少数情况需要在服务器端使用用户的时区而不是UTC,但确实在报告内部打印日期时间值是其中之一,因为客户端没有机会转换所生成报告的内容。这就是为什么报告引擎提供了一个实用程序方法:在报告的上下文中提供的formatLang()方法(至少基于RML的报告)将根据用户的时区偏好格式化日期,如果您使用日期时间值和date_time=True调用它(它使用在RPC调用中传递的tz上下文变量,并基于用户的时区偏好)。您可以在官方插件中找到如何使用此方法的示例,例如在delivery module (l.171)中。

如果您想了解formatLang()的实际转换方法,请查看实现

[1]:请参阅OpenERP 6.1版本说明,以及其他问题,还可以查看错误918257错误925361的第4条评论。


谢谢Odony。我想将时区传递给我的Jasper报告。它没有正确地传递到Jasper服务器。因此,我将本地时间传递给了Jasper报告。 - OmaL

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)

0

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

将其转换为用户所在时区:

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

移除偏移量:

LocalizedDate = LocalizedDate.replace(tzinfo=None)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接