Repository navigation
datetime.strptime accepts incompatible arguments #124549
Description
Activity
- addedtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Sep 25, 2024 I'd be ok with raising exception, seems like it's a user error for passing these kind of conflicting format specifiers.
We could also start documenting this case, saying that the latest format specifiers that appears will prevail.
To avoid the issue where the last directive overwrites earlier values:
since more than one directive is needed, maybe split the string and parse the components manually (handling the split and parsing based on the length of the string)?
Maybe also apply custom logic to handle dynamic formats, especially if you encounter different scenarios with varying date formats.... (idk if your format is dynamic?)This is an example of what I'm getting at:
def parse_date(input_str): if len(input_str) == 6: # 4-digit year followed by 2-digit year full_year = input_str[:4] short_year = input_str[4:] year_full = datetime.strptime(full_year, "%Y") year_short = datetime.strptime(short_year, "%y") return year_short.replace(year=year_full.year) # Use full year from the first part elif len(input_str) == 4: # Only 4-digit year return datetime.strptime(input_str, "%Y") else: raise ValueError("Invalid date format")
Example usage:
input_str = "200099" parsed_date = parse_date(input_str) print(parsed_date) # datetime.datetime(1999, 1, 1, 0, 0)
- addedstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directoryextension-modulesC modules in the Modules dirC modules in the Modules dir
on Dec 17, 2024 This is a stdlib issue (
strptime.py) the extension-modules label can be removed.- removedextension-modulesC modules in the Modules dirC modules in the Modules dir
on Aug 29, 2025
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsNo status
Bug report
Bug description:
If you over-specify a datetime strptime string, it seems that
datetime.strptimewhen encountering a component that has been specified twice, will overwrite earlier values with more recent ones.One approach would be to ban over-specified formats, but that would be a problem for someone who wants to, use a format like "%M %B" (e.g. something sortable by month number while also showing month name), so I think we don't want to do that.
Alternatively we could start raising an exception if you get different values from these two things, or possibly a warning.
Or we can just accept that if you use a weird format you should expect weird behavior.
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs
datetime.*.strptime#132524