为啥只有一个日期受 DST 影响?

Posted

技术标签:

【中文标题】为啥只有一个日期受 DST 影响?【英文标题】:Why is only one date under DST influence?为什么只有一个日期受 DST 影响? 【发布时间】:2021-10-18 19:58:20 【问题描述】:

我一直在阅读 pytz 和 datetime 模块文档,但我无法弄清楚为什么一个日期在 DST 之下而另一个不在。

import pytz
import datetime

mytz = pytz.timezone('America/New_York')

od = datetime.datetime(2021, 7, 1, 4, 0)

mytz.localize(od)
# Out: datetime.datetime(2021, 7, 1, 4, 0, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>)

mytz.localize(od).dst()
# Out: datetime.timedelta(0, 3600)

dt = datetime.datetime(2089, 7, 1, 4, 0)

mytz.localize(dt)
# Out: datetime.datetime(2089, 7, 1, 4, 0, tzinfo=<DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)

mytz.localize(dt).dst()
# Out: datetime.timedelta(0)


【问题讨论】:

今天没有人知道 2089 年的日期是否是夏令时。所以,这里甚至没有一个正确的答案。对 pytz 来说,继续今天的规则是有意义的,除非它知道它即将被废除。但是,答案是什么也同样有意义。为什么 DST 规则似乎“过期”了……有人必须深入挖掘。 @deceze 好的,但是 2088 年呢,你说的是真的吗,2087 年呢,……直到 2022 年,为什么更确定?假设 DST 规则未知,pytz 放弃哪一年(根据您的说法)?反正pytz github上有这个小问题; 2038 年之后的日期目前给出错误的 DST github.com/stub42/pytz/issues/31 【参考方案1】:

如果您查看时区规则的来源,您会发现它们可以有一个关键字“max”指定“用于将规则的应用扩展到无限期”@987654321 @。对于美国,您可以找到 here。除非另有说明,DST 仅在一年中的指定期间继续适用。但请记住,这并不意味着将来确实如此,因为时区受政治决定的影响。

作为对@balmy 的评论的补充,表明这是pytz 的缺陷,Python 3.9 的zoneinfo 给出了上述预期的结果:

import datetime
from zoneinfo import ZoneInfo

od = datetime.datetime(2021, 7, 1, 4, 0, tzinfo=ZoneInfo('America/New_York'))
print(od.dst())
# 1:00:00

dt = datetime.datetime(2089, 7, 1, 4, 0, tzinfo=ZoneInfo('America/New_York'))
print(dt.dst())
# 1:00:00

【讨论】:

以上是关于为啥只有一个日期受 DST 影响?的主要内容,如果未能解决你的问题,请参考以下文章

这样的SQL语句(游标)为啥要被重复执行5次? (5 行受影响) (5 行受影响) (5 行受影响) (5 行受影响) (5

为啥我会得到额外的(1 行受影响)[重复]

从一个本地时区到另一个本地时区的 Python 日期时间转换(+ 奖励 DST)

为啥只有 clone 和 finalize 是对象类中的受保护方法?

Oracle.ManagedDataAccess 错误地读取 DST 日期

php时间函数