Skip to content

datetime.strptime parses input wrong #57095

Description

@heidarrafn
mannequin
BPO 12886
Nosy @abalkin, @vstinner, @ezio-melotti
Files
  • issue12886.patch
  • issue12886.patch
  • 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:

    assignee = None
    closed_at = None
    created_at = <Date 2011-09-02.14:33:26.942>
    labels = ['type-bug', '3.8', '3.9', '3.10', '3.7', 'library']
    title = 'datetime.strptime parses input wrong'
    updated_at = <Date 2020-05-31.12:37:23.388>
    user = 'https://bugs.python.org/heidarrafn'

    bugs.python.org fields:

    activity = <Date 2020-05-31.12:37:23.388>
    actor = 'serhiy.storchaka'
    assignee = 'none'
    closed = False
    closed_date = None
    closer = None
    components = ['Library (Lib)']
    creation = <Date 2011-09-02.14:33:26.942>
    creator = 'heidar.rafn'
    dependencies = []
    files = ['27675', '27688']
    hgrepos = []
    issue_num = 12886
    keywords = ['patch']
    message_count = 7.0
    messages = ['143400', '143401', '143402', '143515', '143517', '173600', '173644']
    nosy_count = 5.0
    nosy_names = ['belopolsky', 'vstinner', 'ezio.melotti', 'heidar.rafn', 'hieu.nguyen']
    pr_nums = []
    priority = 'normal'
    resolution = None
    stage = 'patch review'
    status = 'open'
    superseder = None
    type = 'behavior'
    url = 'https://bugs.python.org/issue12886'
    versions = ['Python 3.6', 'Python 3.7', 'Python 3.8', 'Python 3.9', 'Python 3.10']

    Linked PRs

    Activity

    1. heidarrafn commented on Sep 2, 2011

      heidarrafnmannequin
      MannequinAuthor

      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.

    2. added
      stdlibStandard Library Python modules in the Lib/ directory
      type-bugAn unexpected behavior, bug, or error
      on Sep 2, 2011
    3. vstinner commented on Sep 2, 2011

      @vstinner
      Member

      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.

    4. vstinner commented on Sep 2, 2011

      @vstinner
      Member

      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:56

    5. heidarrafn commented on Sep 5, 2011

      heidarrafnmannequin
      MannequinAuthor

      My 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)

    6. heidarrafn commented on Sep 5, 2011

      heidarrafnmannequin
      MannequinAuthor

      This issue is also discussed here: http://bugs.python.org/issue5979

    7. hieunguyen commented on Oct 23, 2012

      hieunguyenmannequin
      Mannequin

      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.

    8. hieunguyen commented on Oct 23, 2012

      hieunguyenmannequin
      Mannequin

      Attached another patch for clearer test cases against this fix (as suggested from Ezio).

    9. transferred this issue fromon Apr 10, 2022
    10. 5 remaining items

    11. added
      docsDocumentation in the Doc dir
      and removed on Mar 10, 2025
    12. added a commit that references this issue on Feb 12, 2026
    13. added 2 commits that reference this issue on Feb 12, 2026
    14. added 2 commits that reference this issue on Feb 12, 2026
    15. added a commit that references this issue on Feb 15, 2026
    16. added a commit that references this issue on Feb 28, 2026
    17. added a commit that references this issue on Apr 25, 2026
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      docsDocumentation in the Doc dirstdlibStandard Library Python modules in the Lib/ directory

      Projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions