Skip to content

Commit 3b8235a

Browse files
committed
Fix datetime.astimezone() method (gh-83861)
WIP - test and pure python fix Resolves gh-83861
1 parent 5f6c356 commit 3b8235a

File tree

2 files changed

+9
-0
lines changed

2 files changed

+9
-0
lines changed

Lib/datetime.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1962,6 +1962,11 @@ def replace(self, year=None, month=None, day=None, hour=None,
19621962
def _local_timezone(self):
19631963
if self.tzinfo is None:
19641964
ts = self._mktime()
1965+
# Detect gap
1966+
ts2 = self.replace(fold=1-self.fold)._mktime()
1967+
if ts2 != ts: # This happens in a gap or a fold
1968+
if (ts2 > ts) == self.fold:
1969+
ts = ts2
19651970
else:
19661971
ts = (self - _EPOCH) // timedelta(seconds=1)
19671972
localtm = _time.localtime(ts)

Lib/test/datetimetester.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6212,6 +6212,10 @@ def test_system_transitions(self):
62126212
ts1 = dt.replace(fold=1).timestamp()
62136213
self.assertEqual(ts0, s0 + ss / 2)
62146214
self.assertEqual(ts1, s0 - ss / 2)
6215+
# gh-83861
6216+
utc0 = dt.astimezone(timezone.utc)
6217+
utc1 = dt.replace(fold=1).astimezone(timezone.utc)
6218+
self.assertEqual(utc0, utc1 + timedelta(0, ss))
62156219
finally:
62166220
if TZ is None:
62176221
del os.environ['TZ']

0 commit comments

Comments
 (0)