【问题标题】:how to get tz_info object corresponding to current timezone?如何获取与当前时区对应的 tz_info 对象?
【发布时间】:2010-12-13 11:03:57
【问题描述】:

python(或pytz)中是否有跨平台函数返回一个tzinfo对象对应当前在计算机上设置的时区?

环境变量不能依赖,因为它们不是跨平台的

【问题讨论】:

    标签: python datetime time timezone pytz


    【解决方案1】:
    >>> import datetime
    >>> today = datetime.datetime.now()
    >>> insummer = datetime.datetime(2009,8,15,10,0,0)
    >>> from pytz import reference
    >>> localtime = reference.LocalTimezone()
    >>> localtime.tzname(today)
    'PST'
    >>> localtime.tzname(insummer)
    'PDT'
    >>> 
    

    【讨论】:

    • pytz docs say that pytz.reference仅用于测试
    • 该警告适用于 reference.USTimeZone,它使用 2007 年之前的美国 DST 规则。但是这里使用的reference.LocalTimezone 会探测time.localtime 的行为,其正确性由系统库维护。 reference.LocalTimezone 在 2007 年美国规则变更前后提供正确的 DST 转换;我没有针对其他国家/地区进行测试。
    • @rob:错误。不要使用LocalTimezone()pytz 提供历史时区数据,而time.timezonetime.altzone(由LocalTimezone() 使用)是常量,即它们最多反映最新时区定义。当地时区在过去/未来可能有不同的 UTC 偏移量,例如,在 2010-2015 年尝试欧洲/莫斯科时区,看看会发生什么。
    • @J.F.Sebastian 据我了解,这只会影响处理历史时间或算术。出于我的目的,我只需要知道与 UTC 的本地系统偏移量即可解析来自系统的未来时间戳(例如 syslogs),然后立即转换为 UTC。为此使用LocalTimezone() 是否安全?
    • @notbad.jpeg 没有。未来的 UTC 偏移量也可能发生变化。
    【解决方案2】:

    tzlocal module 返回 pytz 时区适用于 *nix 和 win32:

    from datetime import datetime
    from tzlocal import get_localzone # $ pip install tzlocal
    
    # get local timezone    
    local_tz = get_localzone() 
    
    
    print local_tz.localize(datetime(2012, 1, 15))
    # -> 2012-01-15 00:00:00+04:00 # current utc offset
    print local_tz.localize(datetime(2000, 1, 15))
    # -> 2000-01-15 00:00:00+03:00 # past utc offset (note: +03 instead of +04)
    print local_tz.localize(datetime(2000, 6, 15))
    # -> 2000-06-15 00:00:00+04:00 # changes to utc offset due to DST
    

    注意:它考虑了 DST 和非 DST UTC 偏移量变化。

    【讨论】:

      【解决方案3】:

      Python 3.7:

      import datetime
      
      datetime.datetime.now().astimezone().tzinfo
      

      【讨论】:

        【解决方案4】:

        time.timezone 返回当前时区偏移量。还有一个datetime.tzinfo,如果你需要更复杂的结构。

        【讨论】:

        • time.timezone() 只返回与 UTC 的偏移量。我想要一个 tzinfo 对象。所以我可能会想要什么函数:1.定义一个对应于tzinfo对象的类2.实例化对象3.返回它
        • datetime 文档有一个示例来解释tzinfo 的使用。
        • datetime.datetime.now() + datetime.timedelta(seconds=time.timezone) 做得很好。
        • @Baczek: time.timezone 不考虑夏令时。
        【解决方案5】:

        以下代码 sn-p 返回不同时区的时间,与服务器上配置的时区无关。

        # pip install pytz tzlocal
        
        from tzlocal import get_localzone
        from datetime import datetime
        from pytz import timezone
        
        local_tz = get_localzone()
        local_datetime = datetime.now(local_tz)
        
        zurich_tz = timezone('Europe/Zurich')
        zurich_datetime = zurich_tz.normalize(local_datetime.astimezone(zurich_tz))
        

        【讨论】:

        【解决方案6】:

        我自己没有使用过,但是 dateutil.tz.tzlocal() 应该可以解决问题。

        http://labix.org/python-dateutil#head-50221b5226c3ccb97daa06ea7d9abf0533ec0310

        【讨论】:

        • tzlocal() 对于过去的日期可能会失败,例如,'Europe/Moscow' 时区在 2011 年之前有不同的 UTC 偏移量(dateutil 失败,但 pytz 适用于此类时区)
        【解决方案7】:

        不妨试试:

        import time

        print time.tzname #或time.tzname[time.daylight]

        【讨论】:

        【解决方案8】:

        我也在问自己,我在 [1] 中找到了答案:

        看一下第 8.1.7 节:格式“%z”(小写,Z 大写也返回时区,但不是 4 位格式,而是时区缩写形式,如 [ 3]) 的 strftime 返回格式“+/- 4DIGIT”,这是电子邮件标头中的标准格式(请参阅 RFC 2822 的第 3.3 节,请参阅 [2],它废弃了为电子邮件标头指定时区的其他方法)。

        因此,如果您希望您的时区采用这种格式,请使用:

        time.strftime("%z")
        

        [1]http://docs.python.org/2/library/datetime.html

        [2]https://www.rfc-editor.org/rfc/rfc2822#section-3.3

        [3]时区缩写:http://en.wikipedia.org/wiki/List_of_time_zone_abbreviations,仅供参考。

        【讨论】:

        • 它没有给出tzinfo 对象。您可以将本地时区的当前 UTC 偏移量作为秒数:-altzone if daylight and localtime().tm_isdst > 0 else -timezone(所有名称均来自 time 模块)。
        猜你喜欢
        • 2019-05-24
        • 2017-02-12
        • 2011-01-08
        • 2023-03-13
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        相关资源
        最近更新 更多