`timedelta`对象不考虑夏令时

我试图在用户的本地时区中获取适当的时间范围以在数据库中查询(日期时间存储在UTC中)。这是我发现的一些奇怪行为,我不知道该如何解决:

import pytz
from datetime import datetime,timedelta

local_tz = pytz.timezone("America/New_York")
utc = pytz.timezone("UTC")

start = local_tz.localize(datetime(2019,11,3))  # 2019-11-03 00:00:00-04:00
end = start + timedelta(days=1)  # 2019-11-04 00:00:00-04:00

start_utc = utc.normalize(start)  # 2019-11-03 04:00:00+00:00
end_utc = utc.normalize(end)  # 2019-11-04 04:00:00+00:00

utc.normalize(local_tz.localize(datetime(2019,4)))  # 2019-11-04 05:00:00+00:00

当标准化end变量(通过向timedelta添加start对象构成的变量)时,夏令时更改丢失了。为什么会发生这种情况?

ermaotd 回答:`timedelta`对象不考虑夏令时

不确定日期时间计算的预期行为,但是我仅从共享代码示例中解释行为。

pytz.localize创建一个时区感知日期时间实例。当NY时区用于localize天真日期时间时,它将分配正确的时区,EDT直到11月3日,EST则是11月4日及以后。让我们在这里排除timedelta

>>> import pytz
>>> from datetime import datetime,timedelta
>>> tz_ny = pytz.timezone("America/New_York")
>>> tz_ny.localize(datetime(2019,11,3))
datetime.datetime(2019,3,tzinfo=<DstTzInfo 'America/New_York' EDT-1 day,20:00:00 DST>)
>>> tz_ny.localize(datetime(2019,4))
datetime.datetime(2019,4,tzinfo=<DstTzInfo 'America/New_York' EST-1 day,19:00:00 STD>)

正如人们所料,DstTzInfo有所不同,因为纽约夏令时结束于11月3日。

共享代码示例在11月3日start之前创建了localizing,该日期将EDT作为tzinfo分配给日期时间对象(使用DST)。要创建end,将1天的timedelta添加到start,但是tzinfo对象的datetimekept untouched

>>> start = tz_ny.localize(datetime(2019,3))
>>> start.tzinfo
<DstTzInfo 'America/New_York' EDT-1 day,20:00:00 DST>
>>> end = start + timedelta(days=1)
>>> end.tzinfo
<DstTzInfo 'America/New_York' EDT-1 day,20:00:00 DST>

因此,end是11月4日的datetime,但是DstTzInfo信息仍然与11月3日相同。这与11月4日的localizing天真datetime(不使用DST)不同。

本文链接:https://www.f2er.com/3158719.html

大家都在问