NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #314 most downloaded on PyPI
croniter provides iteration for datetime object with cron like format
Last release 2 months ago
10 Jul 2026
Release timing varies
gaps range from 8 days to 1.2 years
Nearly every release is documented
notes for 58 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
17 years old
106 releases · first in 2010
Fix expand_from_start_time day-of-week low bound so Sunday wraps correctly for stepped day-of-week ranges ( isoweekday() % 7 instead of weekday() + 1
Fix expand_from_start_time day-of-week low bound so Sunday wraps correctly for stepped day-of-week ranges (isoweekday() % 7 instead of weekday() + 1). [44e3090, #239, @alhudz]
Bump pinned GitHub Actions via dependabot. [fd13d2e, #240; 5cd2e46, #238]
One column per quarter.
Features and Improvements ~~~~~~~~~~~~~~~~~~~~~~~~
Fix quadratic expansion of comma-separated range lists for a large speed-up on expressions with many ranges. [1d79fc6, #231, @alhudz]
Reject a zero step (e.g. 5-5/0) in equal and reversed cron ranges instead of silently accepting it. [ab27767, #232, @alhudz]
Fix expand_from_start_time month low-bound off-by-one so stepped month ranges start on the correct month. [f329964, #235, @alhudz]
Fix zizmor-reported security findings in GitHub Actions workflows. [ed19f94, #230]
Bump pinned build and CI dependencies via dependabot.
Upgrade locked development and build dependencies (uv lock --upgrade).
Switch build backend from flit_core to hatchling with pinned dependencies. [4cce160]
Switch build backend from flit_core to hatchling with pinned dependencies. [4cce160]
Add PEP 639 license expression (license = "MIT") to project metadata. [4cce160]
Pin all GitHub Actions to SHA hashes across CI workflows. [4cce160]
Add dependabot for automated dependency updates. [4cce160]
Add zizmor workflow for CI security scanning. [4cce160]
Fix get_prev skipping Feb 29 on leap years for day-of-month expressions. [441a0b5, #203, @Souls-R]
Fix get_prev skipping Feb 29 on leap years for day-of-month expressions. [441a0b5, #203, @Souls-R]
Add License :: OSI Approved :: MIT License classifier. [270cbbc, @cdheiser]
Features and Improvements ~~~~~~~~~~~~~~~~~~~~~~~~
Add support for W (nearest weekday) in the day-of-month field. [c79d88a]
Add precision_in_seconds parameter to match() and match_range() to allow overriding the default matching precision. [7415d1e, #58]
Add strict parameter to is_valid() and expand() for cross-field validation of impossible day/month combinations. [0352d48, #199]
Fix memory leak by removing EXPRESSIONS global dict cache. [6ebfe56, @Souls-R]
Document day_or and implement_cron_bug parameters for day-of-month/day-of-week interaction. [289bf73, #75]
Document precision_in_seconds parameter and default precision behavior for match(). [7415d1e, #58]
Features and Improvements ~~~~~~~~~~~~~~~~~~~~~~~~
Support for zoneinfo timezones. [b4e7295, Benjamin Drung (@bdrung)]
Add type hints to croniter.__init__, timestamp_to_datetime, and property initializations. [b171ea9, 257741e, c4f5e44, Benjamin Drung (@bdrung)]
Simplify code for max_years_between_matches. [e065efa, Benjamin Drung (@bdrung)]
Extend type check for hash_id to empty str/bytes. [6fe1d43, Benjamin Drung (@bdrung)]
Drop unused _get_next_nearest and _get_prev_nearest. [d7dab3a, Benjamin Drung (@bdrung)]
Reduce line length to 99 and unfold long Python code lines. [ecea402, f38d5f4, Benjamin Drung (@bdrung)]
Fix memory leak by removing TIMESTAMP_TO_DT_CACHE global dict cache. [1a9d3c0, Rafał Safin (@rafsaf)]
Fix memory leak by removing EXPRESSIONS global dict cache. [1883e15, @Souls-R]
Fix default value of second_at_beginning to a boolean. [dc63ed2, Benjamin Drung (@bdrung)]
Fix always missing the timestamp to datetime cache. [18eb299, Benjamin Drung (@bdrung)]
Fix skipping first of March. [de21a9d, Benjamin Drung (@bdrung)]
Fix DST handling by rewriting the DST logic. [f48387b, Benjamin Drung (@bdrung)]
Fix all flake8 complaints. [08c1f83, Benjamin Drung (@bdrung)]
Test: fix date in DST test. [871e391, Benjamin Drung (@bdrung)]
Test: document time jumps in DST test cases. [2d72258, Benjamin Drung (@bdrung)]
Test: use isoformat() to compare dates with timezone information. [1dd3562, Benjamin Drung (@bdrung)]
Announce back that croniter is maintained now as part of pallets-eco. [Jarek Potiuk (@jarekpotiuk)]
Nothing published for this version
Announce for now that croniter dev is ended (CRA).
Announce for now that croniter dev is ended (CRA).
Rework timestamp_to_datetime to use whatever timezone [kiorky]
Make datetime_to_timestamp & timestamp_to_datetime public [kiorky]
Fix EPOCH calculation in case of non UTC & 32 bits based systems [kiorky]
Apply isort formatter [kiorky]
Reintegrate test_speed [kiorky]
Apply black formatter [evanpurkhiser, kiorky]
Remove unused _get_caller_globals_and_locals [evanpurkhiser]
Remove single-use bad_length [evanpurkhiser]
Remove unused days in proc_month [evanpurkhiser]
Use field_index over i for readability [evanpurkhiser]
Always use """ for docstrings [evanpurkhiser]
Make helper instance methods that do not use self static [evanpurkhiser]
Remove unusd call to sys.exc_info [evanpurkhiser]
Remove unused ALPHAS [evanpurkhiser]
Improve croniter.expand documentation [evanpurkhiser]
Community wanted: Reintroduce 7 as DayOfWeek in deviation from standard cron (#90). [kiorky]
Community wanted: Reintroduce 7 as DayOfWeek in deviation from standard cron (#90). [kiorky]
Remove DayOfWeek alias 7 to DayOfWeek 0 to stick to standard cron (#90). [kiorky]
Remove DayOfWeek alias 7 to DayOfWeek 0 to stick to standard cron (#90). [kiorky]
Fix DOW ranges calculations when lastday is a Sunday. [kiorky]
Fix overflow on 32bits systems (#87) [kiorky]
Fix overflow on 32bits systems (#87) [kiorky]
Fix python2 testing (related to #93) [kiorky]
Modernize packaging. Special thanks to Aarni Koskela (akx) for all the inputs. [kiorky, akx]
- fix lint [kiorky]
fix lint [kiorky]
Fix start_time not respected in get_next/get_prev/all_next/all_prev (#86) [hesstobi, kiorky]
Fix start_time not respected in get_next/get_prev/all_next/all_prev (#86) [hesstobi, kiorky]
Add an update_current argument to get_next/get_prev/all_next/all_prev to facilitate writing of some downstream code, see #83. [kiorky]
Add an update_current argument to get_next/get_prev/all_next/all_prev to facilitate writing of some downstream code, see #83. [kiorky]
Support for year field [zhouyizhen, kiorky]
Support for year field [zhouyizhen, kiorky]
Better support for 6 fields (second), and 7 fields crons [zhouyizhen, kiorky]
Better fix hashed expressions omitting some entries (#82, #42, #30) fix is retained over #42 initial fix [zhouyizhen, kiorky]
Ensure match return false when not time available (#81) [zhouyizhen, kiorky]
- fix doc
fix doc
Implement second_at_beginning [zhouyizhen, kiorky]
Implement second_at_beginning [zhouyizhen, kiorky]
Support question mark as wildcard [zhouyizhen, kiorky]
Support to start a cron from a reference start time [mghextreme, kiorky]
- No changes, fix lint [kiorky]
No changes, fix lint [kiorky]
Support hashid strings in is_valid [george-kuanli-peng, kiorky]
Support hashid strings in is_valid [george-kuanli-peng, kiorky]
Avoid over-optimization in crontab expansions [Cherie0125, liqirui <liqirui@baidu.com>, kiorky]
Add match_range function [salitaba]
Add match_range function [salitaba]
fix leap year (29 days in February) [zed2015]
fix leap year (29 days in February) [zed2015]
- Fix release issue [kiorky]
Fix release issue [kiorky]
Add Python 3.12 support [rafsaf]
Add Python 3.12 support [rafsaf]
Make major release instructions [kiorky]
Make a retrocompatible version of 1.4.0 change about supporting VIXIECRON bug. (fix #47) [kiorky]
Make a retrocompatible version of 1.4.0 change about supporting VIXIECRON bug. (fix #47) [kiorky]
Added "implement_cron_bug" flag to make the cron parser compatible with a bug in Vixie/ISC Cron [kiorky, David White ] *WARNING*: EXPAND METHOD CHANGE
Added "implement_cron_bug" flag to make the cron parser compatible with a bug in Vixie/ISC Cron [kiorky, David White <dwhite2@cisco.com>] WARNING: EXPAND METHOD CHANGES RETURN VALUE
Fix hashed expressions omitting some entries [@waltervos/Walter Vos ]
Fix hashed expressions omitting some entries [@waltervos/Walter Vos <walter.vos@ns.nl>]
Enhance .match() precision for 6 position expressions [@szpol/szymon <szymon.polinkiewicz@gmail.com>]
- Lint
Lint
- Add check for range begin/end
Add check for range begin/end
- restore py2 compat
restore py2 compat
Do not expose i into global namespace
Do not expose i into global namespace
better error handling on py3 [kiorky]
Fix DOW hash parsing [kiorky]
better error handling on py3 [kiorky]
Add Python 3.11 support and move docs files to main folder [rafsaf]
Add Python 3.11 support and move docs files to main folder [rafsaf]
Fix croniter_range infinite loop [Shachar Snapiri ]
fix tests
Fix croniter_range infinite loop [Shachar Snapiri <ssnapiri@paloaltonetworks.com>]
Nothing published for this version
Add Python 3.10 support [eelkevdbos]
Add Python 3.10 support [eelkevdbos]
Really fix compat for tests under py27 [kiorky]
Really fix compat for tests under py27 [kiorky]
Fix compat for tests under py27 [kiorky]
Fix compat for tests under py27 [kiorky]
Fix #12: regressions with set_current [kiorky, agateblue]
Fix #12: regressions with set_current [kiorky, agateblue]
Restore compat with python2 [kiorky]
Restore compat with python2 [kiorky]
Add a way to make next() easier to use. This fixes #11 [kiorky]
Add a way to make next() easier to use. This fixes #11 [kiorky]
Enforce validation for day=1. Before this release we used to support day=0 and it was silently glided to day=1 to support having both day in day in 4t
Enforce validation for day=1. Before this release we used to support day=0 and it was silently glided to day=1 to support having both day in day in 4th field when it came to have 6fields cron forms (second repeat). It will now raises a CroniterBadDateError. See https://github.com/kiorky/croniter/issues/6 [kiorky]
Enforce validation for month=1. Before this release we used to support month=0 and it was silently glided to month=1 to support having both day in mon
Enforce validation for month=1. Before this release we used to support month=0 and it was silently glided to month=1 to support having both day in month in 4th field when it came to have 6fields cron forms (second repeat). It will now raises a CroniterBadDateError. See https://github.com/kiorky/croniter/issues/6 [kiorky]
- restore py2 [kiorky]
restore py2 [kiorky]
- better type checks [kiorky]
better type checks [kiorky]
Fix ZeroDivisionError with * * R/0 * * [cuu508]
Fix ZeroDivisionError with * * R/0 * * [cuu508]
Nothing published for this version
Add support for hashed/random/keyword expressions Ryan Finnie (rfinnie)
Add support for hashed/random/keyword expressions Ryan Finnie (rfinnie)
Review support support for hashed/random/keyword expression and add expanders reactor [ kiorky ]
fix bug: bad case:0 6 30 3 * [zed2015(zhangchi)]
fix bug: bad case:0 6 30 3 * [zed2015(zhangchi)]
Add support for L in the day_of_week component. This enable expressions like * * * * L4, which means last Thursday of the month. This resolves #159. [Kintyre]
Create CroniterUnsupportedSyntaxError exception for situations where CRON syntax may be valid but some combinations of features is not supported. Currently, this is used when the day_of_week component has a combination of literal values and nth/last syntax at the same time. For example, 0 0 * * 1,L6 or 0 0 * * 15,sat#1 will both raise this exception because of mixing literal days of the week with nth-weekday or last-weekday syntax. This may impact existing cron expressions in prior releases, because 0 0 * * 15,sat#1 was previously allowed but incorrectly handled. [Kintyre]
Update croniter_range() to allow an alternate croniter class to be used. Helpful when using a custom class derived from croniter. [Kintyre]
Remove external library natsort. Sorting of cron expression components now handled with sorted() with a custom key function. [Kintyre]
Remove external library natsort. Sorting of cron expression components now handled with sorted() with a custom key function. [Kintyre]
Remove futures dependency [kiorky]
Remove futures dependency [kiorky]
Update _expand to lowercase each component of the expression. This is in relation to #157. With this change, croniter accepts and correctly handles *
Update _expand to lowercase each component of the expression. This is in relation to #157. With this change, croniter accepts and correctly handles * * 10-L * *. [cuu508]
Fix _expand to reject int literals with underscores [cuu508]
Fix _expand to reject int literals with underscores [cuu508]
Remove a debug statement to make flake8 happy [cuu508]
Fix combination of star and invalid expression bugs [kiorky]
Fix combination of star and invalid expression bugs [kiorky]
Security fix: fix overflow when using cron ranges [kiorky]
Security fix: fix overflow when using cron ranges [kiorky]
- Spelling fix release
Spelling fix release
Fix #155: raise CroniterBadCronError when error syntax [kiorky]
Fix #155: raise CroniterBadCronError when error syntax [kiorky]
Fix match when datetime has microseconds [kiorky]
Fix match when datetime has microseconds [kiorky]
no changes, just to make sense with new semver2 (making croniter on a stable state) [kiorky]
no changes, just to make sense with new semver2 (making croniter on a stable state) [kiorky]
Added Python 3.8 and 3.9 support [eumiro]
Added Python 3.8 and 3.9 support [eumiro]
Updated docs section regarding max_years_between_matches to be more shorter and hopefully more relevant. [Kintyre]
Updated docs section regarding max_years_between_matches to be more shorter and hopefully more relevant. [Kintyre]
Don't install tests [scop]
Your coding agent can read these notes before it upgrades. Set up the MCP server →