【问题标题】:Python datetime not including DST when using pytz timezone使用 pytz 时区时 Python 日期时间不包括 DST
【发布时间】:2011-02-09 05:38:59
【问题描述】:

如果我将 UTC 日期时间转换为瑞典格式,则包括夏令时 (CEST)。但是,在创建以瑞典为时区的日期时间时,它会获取 CET 而不是 CEST。这是为什么呢?

>>> # Modified for readability
>>> import pytz
>>> import datetime
>>> sweden = pytz.timezone('Europe/Stockholm')
>>>
>>> datetime.datetime(2010, 4, 20, 16, 20, tzinfo=pytz.utc).astimezone(sweden)
datetime(2010, 4, 20, 18, 20, tzinfo=<... 'Europe/Stockholm' CEST+2:00:00 DST>)
>>> 
>>> datetime.datetime(2010, 4, 20, 18, 20, tzinfo=sweden)
datetime(2010, 4, 20, 18, 20, tzinfo=<... 'Europe/Stockholm' CET+1:00:00 STD>)
>>>

【问题讨论】:

    标签: python datetime timezone utc pytz


    【解决方案1】:

    sweden 对象默认指定 CET 时区,但包含足够的信息来了解 CEST 何时开始和停止。

    在第一个示例中,您创建了一个datetime 对象并将其转换为本地时间。 sweden 对象知道您传递的 UTC 时间发生在夏令时,并且可以适当地转换它。

    在第二个示例中,datetime 构造函数始终将您的输入解释为非夏令时并返回适当的对象。

    如果datetime 将您的输入视为挂钟时间并为您选择了适当的夏令时设置,那么在一年中的时间调回时钟时会出现歧义。在挂钟上,同一小时出现两次。因此,datetime 强制您在创建 datetime 对象时指定您使用的时区。

    【讨论】:

    • 感谢您的信息!此外,pytz.timezone 对象的 localize 函数可用于构建本地化的日期时间,而不是 datetime(..., tzinfo=)
    • @Jesper:pytz docs 明确表示要使用 .localize() 而不是带有 tzinfo 参数的 datetime 构造函数用于 DST 时区。
    【解决方案2】:

    时区缩写不是唯一的。例如,“IST”可以指“爱尔兰标准时间”、“伊朗标准时间”、“印度标准时间”或“以色列标准时间”。您不应该依赖解析,而应该使用 zoneinfo 时区。

    【讨论】:

      猜你喜欢
      • 2014-08-17
      • 2019-04-06
      • 2015-02-16
      • 2017-09-30
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 2019-06-19
      相关资源
      最近更新 更多