Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获得用户';在python中,除了服务器时区(UTC)之外,还有哪个本地时区?_Python_Datetime_Openerp - Fatal编程技术网

如何获得用户';在python中,除了服务器时区(UTC)之外,还有哪个本地时区?

如何获得用户';在python中,除了服务器时区(UTC)之外,还有哪个本地时区?,python,datetime,openerp,Python,Datetime,Openerp,在OpenERP中,当我尝试打印当前日期和时间时,它总是打印“UTC”时间。但我想在用户时区中获取时间。每个用户都有不同的时区。例如“CST6CDT”、“美国/太平洋”或“亚洲/加尔各答”。因此,我需要获取用户时区中的时间,以便在报告中显示正确的日期时间。我尝试使用datatime模块中的localize()和replace()函数更改时区。但是我没有得到正确的输出。得到了 from datetime import datetime from pytz import timezone fmt

在OpenERP中,当我尝试打印当前日期和时间时,它总是打印“UTC”时间。但我想在用户时区中获取时间。每个用户都有不同的时区。
例如“CST6CDT”、“美国/太平洋”或“亚洲/加尔各答”。因此,我需要获取用户时区中的时间,以便在报告中显示正确的日期时间。我尝试使用datatime模块中的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)

礼貌:

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

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

这就是为什么报表引擎提供了一个实用方法来执行此操作:在报表上下文中提供的
formatLang()
方法(至少基于RML的方法)将根据用户的时区格式化日期,如果您使用datetime值和
date\u time=True来调用它
(它使用RPC调用中传递的
tz
上下文变量,并基于用户的时区首选项) 您可以在官方插件中找到如何使用它的示例,例如

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

[1] :请参阅开场白,以及对或的评论#4。

来自:


DateInUTC=这是一个如何在普通Python中进行时区转换的示例,但OpenERP推荐了这样做的方法,并提供了指导方针,说明何时进行转换是有意义的(请参阅我的答案)谢谢你。我想把时区传给我的jasper报表。它没有正确地传给jasper服务器。所以我把本地时间传给了jasper报表
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)
LocalizedDate = fields.datetime.context_timestamp(cr, uid, DateInUTC, context=context)
LocalizedDate = LocalizedDate.replace(tzinfo=None)