Repository navigation
datetime.strptime parses input wrong #57095
Description
Activity
When using datetime.strptime or time.strptime to parse string representing timestamp with the format string '%Y%m%dT%H%M%S' then a strange behavior happens when the input string does not contain the seconds: the minute part is split and first digit used as minutes and second digit as seconds !
According to documentation %M shall contain Minute as a decimal number [00,59] and %S shall contain Second as a decimal number [00,61]
Here are few examples to show this:
------------------Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56) [GCC 4.4.5] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import datetime >>> datetime.datetime.strptime('20110817T1234','%Y%m%dT%H%M%S') datetime.datetime(2011, 8, 17, 12, 3, 4) =>ERROR no seconds in input string: minute=3, second=4 =>I would expect exception ValueError or datetime.datetime(2011, 8, 17, 12, 34, 00) >>> datetime.datetime.strptime('20110817T123456','%Y%m%dT%H%M%S') datetime.datetime(2011, 8, 17, 12, 34, 56) =>CORRECT >>> datetime.datetime.strptime('20110817T123456','%Y%m%dT%H%M') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.6/_strptime.py", line 328, in _strptime data_string[found.end():]) ValueError: unconverted data remains: 56 =>CORRECT >>> datetime.datetime.strptime('20110817T1234','%Y%m%dT%H%M') datetime.datetime(2011, 8, 17, 12, 34) => CORRECT
I have tested this with python 2.6 and 2.7
This also happens on when playing with %H%M format string and omit minutes from the input.- addedstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Sep 2, 2011 ERROR no seconds in input string: minute=3, second=4
If you specificy "%S" in the format string, strptime() *requires* seconds. If seconds are optional in your format, you should call strptime() twice: first without '%S', then with '%S' if the first failed.
I don't consider your examples as bugs.
Example:
---import datetime def test(text): try: d = datetime.datetime.strptime(text, '%Y%m%dT%H%M') except ValueError: pass else: print("%s without seconds => %s" % (text, d)) return d = datetime.datetime.strptime(text, '%Y%m%dT%H%M%S') print("%s with seconds => %s" % (text, d)) test('20110817T1234') test('20110817T12345') test('20110817T123456')
Output:
20110817T1234 without seconds => 2011-08-17 12:34:00
20110817T12345 with seconds => 2011-08-17 12:34:05
20110817T123456 with seconds => 2011-08-17 12:34:56Reacted by abduqodirMy understanding of the python documentation and the ISO 8601 standard is that the digits in a timestamp representing hours, minutes and seconds shall always be in pairs of 2 digits (hh, mm, ss), i.e. when a number is less than 10 it should be preceded by 0.
In the example I give, the minute figure is split between minutes and seconds by the python library function which I consider a bug:
datetime.datetime.strptime('20110817T1234','%Y%m%dT%H%M%S')
gives
datetime.datetime(2011, 8, 17, 12, 3, 4)This issue is also discussed here: http://bugs.python.org/issue5979
I have attached a patch for this issue, so that if the format of the input argument doesn't match ISO 8601 format, it will return ValueError: time data xxx does not match format xxx.
Attached another patch for clearer test cases against this fix (as suggested from Ezio).
- added3.7 (EOL)end of lifeend of life3.8 (EOL)end of lifeend of life3.9 (EOL)end of lifeend of life3.10 (EOL)end of lifeend of life
on May 31, 2020 5 remaining items
- addeddocsDocumentation in the Doc dirDocumentation in the Doc dirand removed3.8 (EOL)end of lifeend of life3.7 (EOL)end of lifeend of life
on Mar 10, 2025 - added a commit that references this issue
on Feb 12, 2026 - added a commit that references this issue
on Apr 25, 2026
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsDone
- StatusShow more project fieldsTodo
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
Linked PRs
datetime.*.strptime#131049datetime.*.strptime(GH-131049) #144734datetime.*.strptime(GH-131049) #144735