Skip to content

Commit d3b6683

Browse files
committed
Fix datetime.astimezone() method (pythongh-83861)
WIP - test and pure python fix Resolves pythongh-83861
1 parent 9ef7e75 commit d3b6683

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
@@ -1965,6 +1965,11 @@ def replace(self, year=None, month=None, day=None, hour=None,
19651965
def _local_timezone(self):
19661966
if self.tzinfo is None:
19671967
ts = self._mktime()
1968+
# Detect gap
1969+
ts2 = self.replace(fold=1-self.fold)._mktime()
1970+
if ts2 != ts: # This happens in a gap or a fold
1971+
if (ts2 > ts) == self.fold:
1972+
ts = ts2
19681973
else:
19691974
ts = (self - _EPOCH) // timedelta(seconds=1)
19701975
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)