Python 带时区的日期时间

Python 带时区的日期时间,python,datetime,timezone,zoneinfo,Python,Datetime,Timezone,Zoneinfo,据我所知,python 3.9中的ZoneInfo修复了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 = date

据我所知,python 3.9中的
ZoneInfo
修复了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)

我想是3个小时,从00(12)到3,绝对是3个小时

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感知上下文中的DST。 例如,如果向2038-03-14 00:00:00-05:00添加3小时,如下面的代码所示,则会得到一致的结果:

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
但是,在无DST意识的情况下,您对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

如果使用aware datetime,Python中的
timedelta
s将显示墙时差。在示例datetimes之间,虽然绝对时差只有两个小时(DST转换),但墙时间差为三个小时。更多的解释可以在Paul Gansle的文章中找到。顺便说一句,这并不是2k38问题所特有的(完全不同的故事,请参见int32…)如何获得绝对时差而不是墙壁时差?我将转换为UTC<代码>打印(dt2.astimezone(ZoneInfo('UTC'))-dt.astimezone(ZoneInfo('UTC'))(我认为这是最清晰/可读的选项)。您能否将您的评论作为答案,以便我可以接受?请注意,在显示的时区中,这些日期/时间实例之间存在DST转换。另请参阅我在问题下的评论。我认为“无DST感知上下文”的代码示例有点复杂;转换为UTC更容易(请参见问题下方的注释)。