Skip to content

gh-41431: Add datetime.time.strptime() and datetime.date.strptime() - #120752

Merged
pganssle merged 19 commits into
python:mainfrom
nineteendo:add-datetime.strptime
Sep 25, 2024
Merged

gh-41431: Add datetime.time.strptime() and datetime.date.strptime()#120752
pganssle merged 19 commits into
python:mainfrom
nineteendo:add-datetime.strptime

Conversation

@nineteendo

@nineteendonineteendo commented Jun 19, 2024

Copy link
Copy Markdown
Contributor

Comment threadLib/_strptime.py
@nineteendonineteendo changed the title gh-41431: Add datetime.time.strptime and datetime.date.strptimegh-41431: Add datetime.time.strptime() and datetime.date.strptime()Jun 19, 2024
Comment threadLib/_strptime.py Outdated
@nineteendo
nineteendo marked this pull request as ready for review June 19, 2024 20:36
@nineteendo

This comment was marked as resolved.

Comment threadDoc/library/datetime.rst Outdated
time tuple. See also :ref:`strftime-strptime-behavior` and
:meth:`date.fromisoformat`.

.. note

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it fine to have this note twice in the documentation?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think documentation experts will know better than me, but I think there's a way to define a substitution for this, like this:

|format-note|
.. |format-note| replace::
If *format* specifies a day of month without a year a :exc:`DeprecationWarning` is emitted. This is to avoid a quadrenial leap year bug in code seeking to parse only a month and day, as the default year used when unspecified in the format is not a leap year. Such *format* values may raise an error in Python 3.15. The workaround is to always include a year in your *format*. If parsing *date_string* values that do not have a year, explicitly add a year that is a leap year before parsing:
.. doctest::
>> from datetime import date
>> date_string = "02/29"
>> when = date.strptime(f"{date_string};1984", "%m/%d;%Y") # Avoids leap year bug.
>> when.strftime("%B %d") # doctest: +SKIP
'February 29'
.. versionadded:: 3.14

Then you put |format-note| in the other place as well.

Two other options:

  1. move this to a small fragment file (seems like overkill), and use an ..include directive with it.
  2. put the note in one place, then link to it in the other place (e.g. "See the note on :func:datetime.strptime").

I don't think there's a simple way to do it with a parameter, though.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was just wondering if it was a problem it was mentioned twice. Do I link to datetime.strptime or is this fine?

@vstinner

Copy link
Copy Markdown
Member

@vstinner, would you like to review this? (You requested changes on the old pull request)

I skip my turn :-)

@picnixzpicnixz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So I had a pending review that I forgot to send. Here are some comments!

Comment threadModules/_datetimemodule.c Outdated
Comment threadDoc/library/datetime.rst
Comment threadDoc/library/datetime.rst Outdated
Comment threadDoc/library/datetime.rst Outdated
Comment threadDoc/library/datetime.rst
Comment threadDoc/library/datetime.rst Outdated
Comment threadLib/_pydatetime.py Outdated
Comment threadLib/_pydatetime.py Outdated
Comment threadLib/_strptime.py Outdated
Comment threadModules/_datetimemodule.c Outdated
Comment threadMisc/NEWS.d/next/Library/2024-06-19-19-53-42.gh-issue-41431.gnkUc5.rst Outdated

@pgansslepganssle left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks great so far! I have some suggestions here mostly about the tests.

I'm also working on some hypothesis based tests for this, because there are a couple of properties that we can easily and usefully test here, specifically:

  1. dt == dt.strptime(dt.strftime(format), format) == dt
  2. my_datetime.strftime(format_with_just_dates).date() == my_datetime.date().strftime(format_with_just_dates)
  3. my_datetime.strftime(format_with_just_times).time() == my_datetime.time().strftime(format_with_just_times)

I think the key will just be getting a good hypothesis strategy that generates the format strings.

Comment threadLib/test/datetimetester.py Outdated
Comment threadLib/test/datetimetester.py Outdated
Comment threadLib/_strptime.py
Comment threadLib/test/datetimetester.py
Comment threadLib/test/datetimetester.py
@bedevere-app

Copy link
Copy Markdown

A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated.

Once you have made the requested changes, please leave a comment on this pull request containing the phrase I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

nineteendoand others added 2 commits September 25, 2024 07:46
Co-authored-by: Paul Ganssle <1377457+pganssle@users.noreply.github.com>

@pgansslepganssle left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome, looks good to me! Glad to finally have this done!

@pganssle

Copy link
Copy Markdown
Member

Thanks @nineteendo! Really great work on this one. Thanks for your patience waiting for reviews and your quick response when the reviews came!

emilyemorehouse added a commit to lysnikolaou/cpython that referenced this pull request Sep 26, 2024
* main: (69 commits)
Add "annotate" SET_FUNCTION_ATTRIBUTE bit to dis. (python#124566)
pythongh-124412: Add helpers for converting annotations to source format (python#124551)
pythongh-119180: Disallow instantiation of ConstEvaluator objects (python#124561)
For-else deserves its own section in the tutorial (python#123946)
Add 3.13 as a version option to the crash issue template (python#124560)
pythongh-123242: Note that type.__annotations__ may not exist (python#124557)
pythongh-119180: Make FORWARDREF format look at __annotations__ first (python#124479)
pythonGH-58058: Add quick reference for `ArgumentParser` to argparse docs (pythongh-124227)
pythongh-41431: Add `datetime.time.strptime()` and `datetime.date.strptime()` (python#120752)
pythongh-102450: Add ISO-8601 alternative for midnight to `fromisoformat()` calls. (python#105856)
pythongh-124370: Add "howto" for free-threaded Python (python#124371)
pythongh-121277: Allow `.. versionadded:: next` in docs (pythonGH-121278)
pythongh-119400: make_ssl_certs: update reference test data automatically, pass in expiration dates as parameters python#119400 (pythonGH-119401)
pythongh-119180: Avoid going through AST and eval() when possible in annotationlib (python#124337)
pythongh-124448: Update Windows builds to use Tcl/Tk 8.6.15 (pythonGH-124449)
pythongh-123884 Tee of tee was not producing n independent iterators (pythongh-124490)
pythongh-124378: Update test_ttk for Tcl/Tk 8.6.15 (pythonGH-124542)
pythongh-124513: Check args in framelocalsproxy_new() (python#124515)
pythongh-101100: Add a table of class attributes to the "Custom classes" section of the data model docs (python#124480)
Doc: Use ``major.minor`` for documentation distribution archive filenames (python#124489)
...
@nineteendo
nineteendo deleted the add-datetime.strptime branch September 26, 2024 06:11
@nineteendo

Copy link
Copy Markdown
ContributorAuthor

Can you close the issue?

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@nineteendo@vstinner@pganssle@picnixz