NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #909 most downloaded on Packagist
Lightweight and fast recurrence rules for PHP (RFC 5545)
Last release 2 months ago
29 Jul 2026
Release timing varies
gaps range from 2 weeks to 1.3 years
Nearly every release is documented
notes for 30 of 30 stable releases
Nothing withdrawn
no release was ever pulled
11 years old
31 releases · first in 2016
Drop support for PHP < 7.3 #119
One column per quarter.
Fix "november" typo in french translation #155
Fix insufficient type detection for FREQ and WKST leading to deprecation warning in tests with PHP 8.3 #149
Swedish: Corrects the spelling of monday and the grammar of enumeration partials. #134
Correctly parse DateTimeImmutable #132
Exclude files from dist packages #110
Fix timezone (and the entire rule) changed to uppercase if rule was created using createdFromRfcString #103
createdFromRfcString #103Fix microseconds not always removed from dtstart, causing date comparison issues with specific date input #104
Added bin/review_translations.php as a helper for translators and contributors
Fix getOccurrencesAfter returns empty array when $inclusive is false and $limit is not set #93
getOccurrencesAfter returns empty array when $inclusive is false and $limit is not set #93Fix support for DateTimeImmutable #90
DateTimeImmutable #90Persian (Farsi) translation #72
RRule::createFromRfcString not detecting RSet properly if the rule was lowercaseFix locale format for i18n files without intl extension #67
- Add support for PHP 7.3
Rewrite the core algorithm to use a native PHP generator, drop compatibility with PHP < 5.6 #43
Fix error when timezone is an offset instead of an olson name. #61
### Fixed - Fix typo in NL translation #53
Null check to prevent 0 (false) values being lost when exporting to RFC string #50
Add include_until option to humanReadable to omit the "until" part of the rule #36
Throw exception when passing a float instead of an int (e.g. INTERVAL=1.5) instead of casting silently
RRule::parseRfcString is deprecated. Note: it wasn't part of the documentation in the first place, but just in case someone is using it, it's not remo…
explicit_infinite and include_start options to humanReadable to respectivity omit "forever" and the start date from the sentence.RRule::createFromRfcString() to build either a RRule or a RSet from a string$limit parameter to getOccurrences() and getOccurrencesBetween() to make working with infinite rule easier$dtstart parameter to RRule and RSet constsructor to specify dtstart when working with a RFC string without DTSTART.RRule::parseRfcString is deprecated. Note: it wasn't part of the documentation in the first place, but just in case someone is using it, it's not removed yet.humanReadable() fails if the RRule was created from a RFC string containing the timezone (e.g. DTSTART;TZID=America/New_York:19970901T090000)
humanReadable() fails if the RRule was created from a RFC string containing the timezone (e.g. DTSTART;TZID=America/New_York:19970901T090000)RRule::offsetGet and RSet::offsetGet throw InvalidArgumentException for illegal offset types #22
RRule::offsetGet and RSet::offsetGet throw InvalidArgumentException for illegal offset types #22RRule::i18nLoad() to accept locales such as en_sg and use Locale::parseLocale when possible #24humanReadable fails with intl enabled when the timezone is "Z" #24Add RRule::getRule() method to return original rule array #17
RRule::getRule() method to return original rule array #17RSet::getRRules(), RSet::getExRules(), RSet::getDates() and RSet::getExDates()rfcString when using a frequency constant (instead of a string) to create the rule #16Fixed a bug when combining values with an integer modifier and regular values in BYDAY (example 1MO,FR)
$include_timezone parameter to RRule::rfcString() to produce a RFC string without timezone information
$include_timezone parameter to RRule::rfcString() to produce a RFC string without timezone informationRRule::parseRfcString() is stricter and will not accept invalid DTSTART and UNTIL formats (use the array syntax in the constructor with DateTime objects if you need to create rules with complex combinations of timezones). #13Support for fallback locale when using RRule::humanReadable() #11
New class RRule\RSet (recurrence set) that can combine multiple RRULE, EXRULE, RDATE and EXDATE. #7
RRule\RSet (recurrence set) that can combine multiple RRULE, EXRULE, RDATE and EXDATE. #7RRule\RRuleInterface to unify RRule and RSetisFinite(), isInfinite()occursAt failing when the date passed was a different timezone #8RRule::occursOn has been removed (use occursAt instead)Ensure the results are returned in the same timezone as DTSTART. #6
First release, everything before that was unversioned (dev-master was used).
dev-master was used).Your coding agent can read these notes before it upgrades. Set up the MCP server →