https://github.com/python/cpython/commit/1c5b959ca9110a9ec3e7e51d37b6c48fc7110d11
commit: 1c5b959ca9110a9ec3e7e51d37b6c48fc7110d11
branch: main
author: Lazizbek Ergashev <[email protected]>
committer: pganssle <[email protected]>
date: 2026-10-21T19:38:29-04:00
summary:

gh-159706: Fix pure-Python ZoneInfo.fromutc() fold detection for 
single-transition zones (#159828)

files:
A Misc/NEWS.d/next/Library/2026-10-19-16-49-09.gh-issue-159706.ushGrx.rst
M Lib/test/test_zoneinfo/test_zoneinfo.py
M Lib/zoneinfo/_zoneinfo.py

diff --git a/Lib/test/test_zoneinfo/test_zoneinfo.py 
b/Lib/test/test_zoneinfo/test_zoneinfo.py
index c6393743e93c3d..40696b09d95719 100644
--- a/Lib/test/test_zoneinfo/test_zoneinfo.py
+++ b/Lib/test/test_zoneinfo/test_zoneinfo.py
@@ -642,6 +642,26 @@ def test_one_transition(self):
                 dt_utc_actual = dt_local.astimezone(timezone.utc)
                 self.assertEqual(dt_utc_actual, dt_utc)
 
+    def test_one_transition_fold(self):
+        GMT = ZoneOffset("-00", ZERO)
+        N03 = ZoneOffset("-03", -timedelta(hours=3))
+
+        transitions = [
+            ZoneTransition(datetime(1976, 12, 1), GMT, N03),
+        ]
+
+        after = "<-03>3"
+
+        zf = self.construct_zone(transitions, after)
+        zi = self.klass.from_file(zf)
+
+        dt_utc = datetime(1976, 12, 1, 1, tzinfo=timezone.utc)
+        dt_local = dt_utc.astimezone(zi)
+
+        self.assertEqual(dt_local.fold, 1)
+        self.assertEqual(dt_local.utcoffset(), N03.utcoffset)
+        self.assertEqual(dt_local.astimezone(timezone.utc), dt_utc)
+
     def test_one_zone_dst(self):
         DST = ZoneOffset("DST", ONE_H, ONE_H)
         transitions = [
diff --git a/Lib/zoneinfo/_zoneinfo.py b/Lib/zoneinfo/_zoneinfo.py
index c7ec9b1bf36e22..7cdb4c22fa8932 100644
--- a/Lib/zoneinfo/_zoneinfo.py
+++ b/Lib/zoneinfo/_zoneinfo.py
@@ -144,7 +144,7 @@ def fromutc(self, dt):
             if num_trans > 1 and timestamp >= self._trans_utc[1]:
                 tti_prev, tti = self._ttinfos[idx - 2 : idx]
             elif timestamp > self._trans_utc[-1]:
-                tti_prev = self._ttinfos[-1]
+                tti_prev = self._tti_before
                 tti = self._tz_after
             else:
                 tti_prev = self._tti_before
diff --git 
a/Misc/NEWS.d/next/Library/2026-10-19-16-49-09.gh-issue-159706.ushGrx.rst 
b/Misc/NEWS.d/next/Library/2026-10-19-16-49-09.gh-issue-159706.ushGrx.rst
new file mode 100644
index 00000000000000..ee90605ed0af2b
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-10-19-16-49-09.gh-issue-159706.ushGrx.rst
@@ -0,0 +1,3 @@
+Fix the pure-Python :class:`zoneinfo.ZoneInfo` setting ``fold=0`` in
+:meth:`~datetime.tzinfo.fromutc` for times in the fold created by the only
+transition of a zone with a single transition.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to