Repository navigation
Count elapsed time across DST in timesince - #56
Merged
Merged
Conversation
| timezone = ZoneInfo('America/New_York') | ||
| except ZoneInfoNotFoundError: | ||
| pytest.skip('IANA timezone data is not available') | ||
| current = current.replace(tzinfo=timezone) |
wolph
marked this pull request as ready for review
October 11, 2026 08:36
wolph
added a commit
that referenced
this pull request
Oct 11, 2026
CodeQL flagged timezone as possibly uninitialised in test_timesince_counts_elapsed_time_across_dst, because it does not know that pytest.skip raises. A skipif mark on the available timezones keeps the same skip without the try block.
Owner
|
Thank you for the fix and the thorough tests! DST manages to bite every time library eventually. CodeQL didn't realise that |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
wolph
added a commit
that referenced
this pull request
Oct 11, 2026
#56 converted the current time to UTC when `dt.utcoffset()` was known, so two datetimes that share a tzinfo no longer subtract by wall clock. The subtraction that follows asks the tzinfo for the offset, not `dt`, and a datetime subclass that reports its own offset made the two disagree: a TypeError on CPython and a wrong result on PyPy. Ask `now` for the offset instead. `now` is the plain datetime that `datetime.now` built from the same tzinfo, so it reports the offset the subtraction will use. Datetime subclasses and look-alikes such as `arrow.Arrow` are left to their own subtraction. What working code can notice, against 4.1.1: an aware datetime across a daylight saving change gives the elapsed time instead of the wall-clock difference, whatever its tzinfo. A tzinfo that breaks the tzinfo contract (`utcoffset` raising, returning something other than a timedelta, or an offset of a day or more) now raises Python's own error where 4.1.1 printed a wall-clock difference.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
timesincesubtracts the input fromdatetime.now(input.tzinfo). When both share the same changing timezone, Python ignores UTC-offset changes andfold: the two occurrences of2026-11-01 01:30in New York are one hour apart but currently producejust now. Across the spring transition, one elapsed hour can produce2 hours ago.Convert the current aware time to UTC before subtraction so elapsed time includes offset changes. Leave the input in its original timezone to preserve valid
datetime.min/maxvalues whose equivalent UTC dates would overflow. Naive datetime, timedelta and date-error behavior stay the same. Add past/future fall-back and spring-forward regressions, boundary coverage, and a short guide clarification.Validation:
toxpasses on CPython 3.10–3.14 and PyPy 3.10–3.11: 348 tests per interpreter and 100% statement and branch coverage.Prepared with OpenAI Codex assistance, including implementation, tests and independent review. Current and historical issues and pull requests, including the aware-datetime support in #54, were checked for duplicates.