-
Notifications
You must be signed in to change notification settings - Fork 632
fix: cron should still execute after changing the time back during daylight savings #966
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
46c96ef
to
2338a5d
Compare
I added a couple of custom types to get around a weird issue where Definitely Typed didn't provide all the subproperties on the |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm, great work!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm, great work!
🎉 This PR is included in version 4.1.1 🎉 The release is available on: Your semantic-release bot 📦🚀 |
## [4.1.1](kelektiv/node-cron@v4.1.0...v4.1.1) (2025-03-26) ### 🐛 Bug Fixes * cron should still execute after changing the time back during daylight savings ([kelektiv#966](kelektiv#966)) ([8cf0712](kelektiv@8cf0712)), closes [kelektiv#881](kelektiv#881) [kelektiv#881](kelektiv#881) ### ♻️ Chores * **action:** update actions/setup-node action to v4.3.0 ([e70709f](kelektiv@e70709f)) * **action:** update actions/upload-artifact action to v4.6.1 ([06ed76c](kelektiv@06ed76c)) * **action:** update actions/upload-artifact action to v4.6.2 ([69ea222](kelektiv@69ea222)) * **action:** update github/codeql-action action to v3.28.10 ([1d14a08](kelektiv@1d14a08)) * **action:** update github/codeql-action action to v3.28.11 ([cd28d4f](kelektiv@cd28d4f)) * **action:** update github/codeql-action action to v3.28.13 ([154f885](kelektiv@154f885)) * **action:** update ossf/scorecard-action action to v2.4.1 ([6a4ec39](kelektiv@6a4ec39)) * **deps:** lock file maintenance ([6742c01](kelektiv@6742c01)) * **deps:** lock file maintenance ([a97cdb1](kelektiv@a97cdb1)) * **deps:** lock file maintenance ([c585973](kelektiv@c585973)) * **deps:** lock file maintenance ([e156aa7](kelektiv@e156aa7)) * **deps:** update dependency [@commitlint](https://github.com/commitlint)/cli to v19.8.0 ([3984884](kelektiv@3984884)) * **deps:** update dependency [@eslint](https://github.com/eslint)/js to v9.22.0 ([7415480](kelektiv@7415480)) * **deps:** update dependency [@eslint](https://github.com/eslint)/js to v9.23.0 ([00fc7ed](kelektiv@00fc7ed)) * **deps:** update dependency [@fast-check](https://github.com/fast-check)/jest to v2.1.0 ([a9a8608](kelektiv@a9a8608)) * **deps:** update dependency [@types](https://github.com/types)/node to v22.13.11 ([38cf6a6](kelektiv@38cf6a6)) * **deps:** update dependency [@types](https://github.com/types)/node to v22.13.5 ([a746320](kelektiv@a746320)) * **deps:** update dependency [@types](https://github.com/types)/node to v22.13.9 ([4ac339f](kelektiv@4ac339f)) * **deps:** update dependency lint-staged to v15.5.0 ([5efb27f](kelektiv@5efb27f)) * **deps:** update dependency prettier to v3.5.3 ([d8f2456](kelektiv@d8f2456)) * **deps:** update dependency sinon to v19.0.4 ([5144f4d](kelektiv@5144f4d)) * **deps:** update dependency ts-jest to v29.2.6 ([3625528](kelektiv@3625528)) * **deps:** update dependency typescript to v5.8.2 ([4ef66e8](kelektiv@4ef66e8)) * **deps:** update linters ([ecbe916](kelektiv@ecbe916)) * **deps:** update node.js to v23.10.0 ([kelektiv#970](kelektiv#970)) ([6775fff](kelektiv@6775fff)) * **deps:** update tests ([5d5e555](kelektiv@5d5e555))
Description
This PR will fix the issue where cron did not execute after changing the time back during daylight savings. It also replaces
ts-jest
with@swc/jest
which is a little faster at running tests.Related Issue
fixes #881
Motivation and Context
I ended up doing a big refactor to fix this issue because everything to do with time zones seemed too complicated to understand as is. I decided that rather than trying to decide based on what the time "should" be after a change compared to what it actually was from Luxon, we should just check if the UTC offset changed. That would indicate a daylight savings jump with very little work on our part. Then we could just check if a cron execution was supposed to happen in the gap we skipped.
Building on that idea, I decided to ultimately create a new fake cron time in UTC based on the timezoned time, do all the manipulations without worrying about time zones, and then convert back into the timezoned time and figure out any adjustments if needed.
As for #881 specifically, it looks like some of our date creations were ambiguous. According to the Luxon docs, you can sometimes create ambiguous times if you try to initialize a
DateTime
object in the middle of a daylight savings jumping back event. if the time jumps back and hour at 3 am and I create aDateTime
at 2:30 am on that day, is it the first 2:30 am or the second 2:30 am? I switched some of ourDateTime
creations to UTC to make the time they represented unambiguous, and I added some checks to see if the previous hour was ambiguous or not before returning the time.How Has This Been Tested?
Added a new test case, made sure previous test cases passed (and edited some to make them more clear as to the times being tested), and removed some test cases that tested functions I removed that we no longer needed.
Screenshots (if appropriate):
Types of changes
Checklist:
!
after the type/scope in the title (see the Conventional Commits standard).