为啥只有一个日期受 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
从一个本地时区到另一个本地时区的 Python 日期时间转换(+ 奖励 DST)
为啥只有 clone 和 finalize 是对象类中的受保护方法?