Reputation: 571
As far as I understood ZoneInfo
in python 3.9 fixes the issue of "The year of 2038" problem with DST time issue. But I can see that the timedelta
is wrong. Below it should have been 2 hours, not 3. What is wrong?
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)
Upvotes: 0
Views: 219
Reputation: 508
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
Upvotes: 1
Reputation: 1
I think It’s 3 hours, from 00 (which is 12) to 3 that’s absolutely 3 hours.
Upvotes: 0