Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Doc/library/datetime.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2534,8 +2534,8 @@ requires, and these work on all supported platforms.
| ``%d`` | Day of the month as a | 01, 02, ..., 31 | \(9) |
| | zero-padded decimal number. | | |
+-----------+--------------------------------+------------------------+-------+
| ``%D`` | Equivalent to ``%m/%d/%y``. | 11/10/2025 | \(9), |
| | | | \(0) |
| ``%D`` | Equivalent to ``%m/%d/%y``. | 11/28/25 | \(9) |
| | | | |
+-----------+--------------------------------+------------------------+-------+
| ``%e`` | The day of the month as a | ␣1, ␣2, ..., 31 | |
| | space-padded decimal number. | | |
Expand Down Expand Up @@ -2676,7 +2676,7 @@ differences between platforms in handling of unsupported format specifiers.
``%:z`` was added for :meth:`~.datetime.strftime`.

.. versionadded:: 3.15
``%:z`` and ``%F`` were added for :meth:`~.datetime.strptime`.
``%:z``, ``%F``, and ``%D`` were added for :meth:`~.datetime.strptime`.

Technical Detail
^^^^^^^^^^^^^^^^
Expand Down
1 change: 1 addition & 0 deletions Lib/_strptime.py
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,7 @@ def __init__(self, locale_time=None):
mapping['W'] = mapping['U'].replace('U', 'W')

base.__init__(mapping)
base.__setitem__('D', self.pattern('%m/%d/%y'))
base.__setitem__('F', self.pattern('%Y-%m-%d'))
base.__setitem__('T', self.pattern('%H:%M:%S'))
base.__setitem__('R', self.pattern('%H:%M'))
Expand Down
7 changes: 7 additions & 0 deletions Lib/test/datetimetester.py
Original file line number Diff line number Diff line change
Expand Up @@ -2200,6 +2200,13 @@ def test_strptime_F_format(self):
self.theclass.strptime(test_date, "%Y-%m-%d")
)

def test_strptime_D_format(self):
test_date = "11/28/25"
self.assertEqual(
self.theclass.strptime(test_date, "%D"),
self.theclass.strptime(test_date, "%m/%d/%y")
)


#############################################################################
# datetime tests
Expand Down
9 changes: 8 additions & 1 deletion Lib/test/test_strptime.py
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ def test_ValueError(self):
def test_strptime_exception_context(self):
# check that this doesn't chain exceptions needlessly (see #17572)
with self.assertRaises(ValueError) as e:
_strptime._strptime_time('', '%D')
_strptime._strptime_time('', '%!')
self.assertTrue(e.exception.__suppress_context__)
# additional check for stray % branch
with self.assertRaises(ValueError) as e:
Expand Down Expand Up @@ -663,6 +663,13 @@ def test_strptime_T_format(self):
time.strptime(test_time, "%H:%M:%S")
)

def test_strptime_D_format(self):
test_date = "11/28/25"
self.assertEqual(
time.strptime(test_date, "%D"),
time.strptime(test_date, "%m/%d/%y")
)

class Strptime12AMPMTests(unittest.TestCase):
"""Test a _strptime regression in '%I %p' at 12 noon (12 PM)"""

Expand Down
4 changes: 2 additions & 2 deletions Lib/test/test_time.py
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ def test_strptime(self):
# Should be able to go round-trip from strftime to strptime without
# raising an exception.
tt = time.gmtime(self.t)
for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'F', 'H', 'I',
for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'D', 'F', 'H', 'I',
'j', 'm', 'M', 'p', 'S', 'T',
'U', 'w', 'W', 'x', 'X', 'y', 'Y', 'Z', '%'):
format = '%' + directive
Expand All @@ -379,7 +379,7 @@ def test_strptime_bytes(self):
def test_strptime_exception_context(self):
# check that this doesn't chain exceptions needlessly (see #17572)
with self.assertRaises(ValueError) as e:
time.strptime('', '%D')
time.strptime('', '%!')
self.assertTrue(e.exception.__suppress_context__)
# additional check for stray % branch
with self.assertRaises(ValueError) as e:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add ``'%D'`` support to :meth:`~datetime.datetime.strptime`.
Loading