【问题标题】:How can I convince DateTime object (initialized with pytz timezone) to get me a timezone code recognized by pytz? (Python)如何说服 DateTime 对象(使用 pytz 时区初始化)让我获得 pytz 识别的时区代码? (Python)
【发布时间】:2019-06-23 11:42:25
【问题描述】:
import pytz
import datetime

timezone = pytz.timezone('Poland')
date = timezone.localize(datetime.datetime(2018, 10, 1))
pytz.timezone(date.tzname())

不幸的是,在 Python 3.5.2 中,它崩溃了

Traceback (most recent call last):
  File "timezones.py", line 6, in <module>
    pytz.timezone(date.tzname())
  File "/usr/local/lib/python3.5/dist-packages/pytz/__init__.py", line 178, in timezone
    raise UnknownTimeZoneError(zone)
pytz.exceptions.UnknownTimeZoneError: 'CEST'

在程序时区感知时间对象的一部分中创建。在其他部分,有必要取回时区标识符。

为了避免 XY 问题:我正在使用 skyfield 库计算日出和日落数据。为此,我需要将时区作为参数之一传递。

从我在https://docs.python.org/3/library/datetime.html 看到的内容来看,有一个timezone,但用于设置时区,没有得到它。

【问题讨论】:

  • PolandEurope/Warsaw 更短且更易读,所以只要它有效,我就会继续使用它。
  • 根据list of timezone names in WikipediaPoland已弃用,替换为Europe/Warsaw
  • 编译器不关心长度,使用标准名称可确保您不必检查它是否仍然有效,也不必修复一旦中断就忘记的代码。这也意味着您不必映射来自其他库、文件或程序的时区名称,甚至可能是您自己的
  • @PanagiotisKanavos 我在配置文件中使用它,它不会以任何方式干扰来自其他库、文件或程序的时区名称(在配置文件中它被转换为pytz 时区对象)。

标签: python python-3.x timezone python-3.5 pytz


【解决方案1】:

TZ 数据库时区名称存储为pytz.timezone() 返回的时区对象的zone 属性:

>>> import pytz
>>> import datetime
>>> 
>>> timezone = pytz.timezone('Poland')
>>> date = timezone.localize(datetime.datetime(2018, 10, 1))
>>> date.tzinfo.zone
'Poland'

如您所见,在调用 localize() 后,区域对象本身可以作为 date.tzinfo 使用,因此您可以直接使用它,而不是将名称传回 pytz.timezone(),如果这就是您需要它的原因。

【讨论】:

    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 2015-10-05
    • 2020-08-26
    • 2018-01-03
    • 2022-01-24
    • 2014-01-25
    • 2015-06-13
    • 2018-09-05
    相关资源
    最近更新 更多