0

据我了解ZoneInfo,python 3.9 解决了 DST 时间问题的“2038 年”问题。但我可以看出这timedelta是错误的。下面应该是 2 小时,而不是 3 小时。出了什么问题?

from zoneinfo  import ZoneInfo
import datetime
dt = datetime.datetime(2038,3,14,0,0, tzinfo = ZoneInfo(r'America/New_York'))
print(dt)           
dt2 = datetime.datetime(2038,3,14,3,0, tzinfo = ZoneInfo(r'America/New_York'))
print(dt2-dt)
4

2 回答 2

1
from zoneinfo  import ZoneInfo
import datetime
dt = datetime.datetime(2038,3,14,0,0, tzinfo = ZoneInfo(r'America/New_York'))
print(dt)           # Output: 2038-03-14 00:00:00-05:00
dt2 = datetime.datetime(2038,3,14,3,0, tzinfo = ZoneInfo(r'America/New_York'))
print(dt2)          # Output: 2038-03-14 03:00:00-04:00
timedelta = dt2-dt1
print(timedelta)    # Output: 3:00:00

以上是正确的,因为它知道 DST,也就是在 DST 感知上下文中。例如,如果您像下面的代码一样将 3 小时添加到 2038-03-14 00:00:00-05:00,您会得到一致的结果:

from zoneinfo  import ZoneInfo
import datetime
dt = datetime.datetime(2038,3,14,0,0, tzinfo = ZoneInfo(r'America/New_York'))
print(dt)                                      # Output: 2038-03-14 00:00:00-05:00
print(dt+datetime.timedelta(hours=3))          # Output: 2038-03-14 03:00:00-04:00

但是,在 NO-DST-AWARE 上下文中,您对 2 小时时差的想法是正确的,如下所示:

from zoneinfo  import ZoneInfo
import datetime
dt = datetime.datetime(2038,3,14,0,0, tzinfo = ZoneInfo(r'America/New_York'))
print(dt)           # Output: 2038-03-14 00:00:00-05:00
dt2 = datetime.datetime(2038,3,14,3,0, tzinfo = ZoneInfo(r'America/New_York'))
print(dt2)          # Output: 2038-03-14 03:00:00-04:00
dt_isoformat = dt.isoformat() 
print(dt_isoformat) # Output: 2038-03-14T00:00:00-05:00
dt2_isoformat = dt2.isoformat() 
print(dt2_isoformat) # Output: 2038-03-14T03:00:00-04:00
print(datetime.datetime.fromisoformat(dt2_isoformat)-datetime.datetime.fromisoformat(dt_isoformat)) # Output: 2:00:00
于 2021-05-12T02:53:25.810 回答
0

我认为是 3 小时,从 00(即 12)到 3 绝对是 3 小时。

于 2021-05-12T01:06:31.447 回答