]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-151770: Fix `datetime.fromisoformat()` on an out-of-range month w/ a 24:00 time...
authortonghuaroot (童话) <tonghuaroot@gmail.com>
Sat, 20 Jun 2026 16:33:16 +0000 (00:33 +0800)
committerGitHub <noreply@github.com>
Sat, 20 Jun 2026 16:33:16 +0000 (17:33 +0100)
Co-authored-by: Stan Ulbrych <stan@python.org>
Lib/_pydatetime.py
Lib/test/datetimetester.py
Misc/NEWS.d/next/Library/2026-06-20-15-00-00.gh-issue-151770.dtiso0.rst [new file with mode: 0644]
Modules/_datetimemodule.c

index b6d68f2372850a774efa6e0022e4f1872172d10f..c1448374402de4a99e154b5724f779f67cbcede9 100644 (file)
@@ -55,7 +55,7 @@ def _days_before_year(year):
 
 def _days_in_month(year, month):
     "year, month -> number of days in that month in that year."
-    assert 1 <= month <= 12, month
+    assert 1 <= month <= 12, f"month must be in 1..12, not {month}"
     if month == 2 and _is_leap(year):
         return 29
     return _DAYS_IN_MONTH[month]
@@ -1987,7 +1987,7 @@ class datetime(date):
                 if became_next_day:
                     year, month, day = date_components
                     # Only wrap day/month when it was previously valid
-                    if month <= 12 and day <= (days_in_month := _days_in_month(year, month)):
+                    if 1 <= month <= 12 and day <= (days_in_month := _days_in_month(year, month)):
                         # Calculate midnight of the next day
                         day += 1
                         if day > days_in_month:
index d26e41982deb811b0a7ae09842b85311619503f4..1cbe78c1ecbfdc62e740a7231afe996c6807e1de 100644 (file)
@@ -3773,6 +3773,7 @@ class TestDateTime(TestDate):
             "2009-04-01T12:30:90",          # Second out of range
             "2009-04-01T12:90:45",          # Minute out of range
             "2009-04-01T25:30:45",          # Hour out of range
+            "2009-00-01T24:00:00",          # Month below range
             "2009-13-01T24:00:00",          # Month out of range
             "9999-12-31T24:00:00",          # Year out of range
         ]
diff --git a/Misc/NEWS.d/next/Library/2026-06-20-15-00-00.gh-issue-151770.dtiso0.rst b/Misc/NEWS.d/next/Library/2026-06-20-15-00-00.gh-issue-151770.dtiso0.rst
new file mode 100644 (file)
index 0000000..10b3db8
--- /dev/null
@@ -0,0 +1,3 @@
+Fix :meth:`datetime.datetime.fromisoformat` raising :exc:`AssertionError`
+instead of :exc:`ValueError` for an out-of-range month combined with a
+``24:00`` time.
index 82b1f898a3c67411c4a3769fd512226faedbfc70..979aa1beb8657b260fec048416c3aadeb0996071 100644 (file)
@@ -6144,7 +6144,7 @@ datetime_datetime_fromisoformat_impl(PyTypeObject *type, PyObject *string)
         goto error;
     }
 
-    if ((hour == 24) && (month <= 12))  {
+    if ((hour == 24) && (month >= 1 && month <= 12))  {
         int d_in_month = days_in_month(year, month);
         if (day <= d_in_month) {
             if (minute == 0 && second == 0 && microsecond == 0) {