【问题标题】:To get the LMT info and all the abbrevations tz in pytz获取 LMT 信息和 pytz 中的所有缩写 tz
【发布时间】:2014-10-10 13:09:32
【问题描述】:
import pytz,datetime
tz1 = pytz.timezone('Asia/Shanghai')
tz1
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
>>> str(tz1)
'Asia/Shanghai'

1.如何从tz1的输出中获取LMT+8:06:00的字符串?

fmt = '%Y-%m-%d %H:%M:%S %Z%z'
dt1 = tz1.localize(datetime.datetime(2002, 10, 27, 6, 0, 0))
print(dt1.strftime(fmt))
2002-10-27 06:00:00 CST+0800

2.如何获得由2002-10-27 06:00:00 CST+0800?中的CST等3个大写字符组成的所有时区缩写

list(pytz.country_names) 获取国家的所有缩写,list(pytz.all_timezones) 获取所有时区。

list(pytz.all_timezones)
list(pytz.country_names)

【问题讨论】:

    标签: python timezone pytz


    【解决方案1】:

    1.如何从tz1的输出中得到LMT+8:06:00的字符串?

    单个pytz.timezone('Asia/Shanghai') 对象可能对应多个不同的tzinfo 对象(不同的tzname()dst() 和/或utcoffset())。 tz1 的默认表示显示了此类对象之一。您需要一个具体的日期才能获得正确的 tzinfo:

    >>> from datetime import datetime
    >>> import pytz
    >>> tz = pytz.timezone('Asia/Shanghai')
    >>> tz
    <DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
    >>> fmt = '%Y-%m-%d %H:%M:%S %Z%z'
    >>> tz.localize(datetime(2002, 10, 27, 6, 0, 0), is_dst=None).strftime(fmt)
    '2002-10-27 06:00:00 CST+0800'
    >>> tz.localize(datetime(1902, 10, 27, 6, 0, 0), is_dst=None).strftime(fmt)
    '1902-10-27 06:00:00 LMT+0806'
    

    即,亚洲/上海在 1902 年有 +0806 UTC 偏移量。


    2.如何在 2002-10-27 06:00:00 CST+0800 中获取由 CST 等 3 个大写字符组成的所有时区缩写?

    如果您有一个可识别的日期时间对象,那么只需调用其 .tzname() 方法或将日期显式传递给时区:

    >>> tz.tzname(datetime(2002, 10, 27, 6, 0, 0), is_dst=None)
    'CST'
    

    没有公共 API 可以枚举给定 zoneinfo 时区的所有可能的 tzname() 值。您可以使用DstTzInfo._transition_info 属性来获取值(没有来自遥远未来的值(出于显而易见的原因)):

    >>> datetime.now(tz).tzname()
    'CST'
    >>> {tzname for _, _, tzname in getattr(tz, '_transition_info', [])}
    set(['CDT', 'CST', 'LMT'])
    

    【讨论】:

      猜你喜欢
      • 2017-01-21
      • 1970-01-01
      • 2019-10-20
      • 2012-07-02
      • 2012-04-02
      • 2010-12-30
      • 1970-01-01
      • 2014-03-10
      • 2021-10-22
      相关资源
      最近更新 更多