【问题标题】:How to get user's local timezone other than server timezone(UTC) in python?如何在python中获取用户的本地时区而不是服务器时区(UTC)?
【发布时间】:2012-11-08 12:26:40
【问题描述】:

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

【问题讨论】:

    标签: python datetime openerp


    【解决方案1】:

    知道了。

    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 已经推荐了这样做的方法和指导方针,说明何时有意义(请参阅我的回答)
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 谢谢奥多尼。我想将时区传递给我的碧玉报告。它没有正确传递给 jasper 服务器。所以我把当地时间传递给了jasper报告
    【解决方案3】:

    来自: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)
    

    【讨论】:

      【解决方案4】:

      DateInUTC =

      要转换为用户的时区:

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

      移除偏移:

      LocalizedDate = LocalizedDate.replace(tzinfo=None)
      

      【讨论】:

        猜你喜欢
        • 2011-06-09
        • 2011-02-11
        • 2019-06-09
        • 2013-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多