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
The above is correct because it is made aware of the DST, aka in the DST aware context.
For example, if you add 3 hours to 2038-03-14 00:00:00-05:00 like the code below, you get a consistent result:
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
However, your thinking of 2 hours time difference is correct in the NO-DST-AWARE context, as shown below:
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
timedeltas in Python show wall time difference if you're working with aware datetime. Between your example datetimes, there is a wall time difference of three hours although absolute time difference is only two hours (DST transition). More explanation can be found in this blog article by Paul Ganssle. Btw. this is not specific to the 2k38 problem (completely different story, see int32...)print(dt2.astimezone(ZoneInfo('UTC')) - dt.astimezone(ZoneInfo('UTC')))(most clear / readable option I think).