为什么这两个时间不相等?
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo
chi = ZoneInfo("America/Chicago")
nyc = ZoneInfo("America/New_York")
dt1 = datetime(2024, 3, 10, 3, 30, tzinfo=chi)
dt2 = datetime(2024, 3, 10, 2, 30, tzinfo=chi)
print(dt1 == dt1.astimezone(nyc))
print(dt2 == dt2.astimezone(nyc))
实际结果:
True
False
预期结果:
True
True
为什么在其中一个情况下返回的是 False
呢?在这两种情况下,它比较的都是相同的时间,只是调整到了不同的时区。
在折叠的情况下也会发生同样的事情:
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo
chi = ZoneInfo("America/Chicago")
nyc = ZoneInfo("America/New_York")
dt1 = datetime(2024, 11, 3, 2, 30, tzinfo=chi)
dt2 = datetime(2024, 11, 3, 1, 30, tzinfo=chi)
print(dt1 == dt1.astimezone(nyc))
print(dt2 == dt2.astimezone(nyc))
1 个回答
0
Python的日期时间功能设计上允许创建一些不存在的时间,比如你提到的2024年3月10日凌晨2:30(芝加哥时间)。这就是问题的根源。你不能在不“默默”调整为一个有效时间的情况下,正确地转换到另一个时区(在这个例子中是3:30)。这个调整导致了第二种情况的比较结果为False。为了说明这一点,你可以进行一个转换的回合:
from datetime import datetime
from zoneinfo import ZoneInfo
chi = ZoneInfo("America/Chicago")
nyc = ZoneInfo("America/New_York")
dt1 = datetime(2024, 3, 10, 3, 30, tzinfo=chi)
dt2 = datetime(2024, 3, 10, 2, 30, tzinfo=chi) # non-existent !
print(dt1 == dt2) # False
print(dt1.astimezone(nyc)) # 2024-03-10 04:30:00-04:00
print(dt2.astimezone(nyc)) # also 2024-03-10 04:30:00-04:00 !
print(dt1.astimezone(nyc).astimezone(chi)) # 2024-03-10 03:30:00-05:00
print(dt2.astimezone(nyc).astimezone(chi)) # also 2024-03-10 03:30:00-05:00 !
dt2
从纽约时间转换回芝加哥时间时,得到的字段变得不同(现在是有效的)——2点变成了3点。这两个时间不相等,所以比较结果正确地返回False。
为了完整起见,假如你把这个例子放在夏令时转换的另一侧,夏令时从启用变为禁用,会发生什么:
dt1 = datetime(2024, 11, 3, 1, 30, tzinfo=chi) # ambiguous; exists twice (UTC-5 and UTC-6)
dt2 = datetime(2024, 11, 3, 2, 30, tzinfo=chi)
print(dt1, dt1.astimezone(nyc)) # 2024-11-03 01:30:00-05:00 2024-11-03 01:30:00-05:00
print(dt1.fold, dt1.astimezone(nyc).fold) # 0, 1
print(dt1 == dt1.astimezone(nyc)) # False
print(dt2 == dt2.astimezone(nyc)) # True
你会注意到对于dt1
,芝加哥和纽约的墙上时间和UTC偏移量是一样的——但这些日期时间落在了“夏令时折叠”的不同侧,因为时区不同。纽约时间比芝加哥时间快,所以它已经进入了冬季时间,而芝加哥仍然处于夏季时间。因此,这些日期时间并不相同,比较结果返回False。