# What changed in rrule-temporal

> 19 changes in rrule-temporal 2 from its official release notes, upgrade guides and advisories: 4 breaking. Each one cited. Sources checked 2026-10-24. HTML: https://unstale.sh/npm/rrule-temporal/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## rrule-temporal 2

### Breaking changes

- SECONDLY and MINUTELY rules limited by BYDAY now begin at the matching day's first second or minute rather than at DTSTART's time of day. (2.2.7) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.7)
- HOURLY, MINUTELY, and SECONDLY rules with BYxxx parts now follow DTSTART + k * INTERVAL instead of jumping to the next BYxxx value; results may differ from v2.2.6 and stored occurrences may need regeneration. (2.2.7) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.7)
- Weekly BYSETPOS ranking now occurs after date filters. (2.2.6) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.6)
- Generated starts in DST gaps are omitted before BYSETPOS and COUNT; explicit DTSTART/RDATE inputs retain their interpretation. (2.2.6) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.6)

### Performance

- Sub-daily rules with BYxxx parts use an integer engine that constructs only returned occurrences; additional UTC and named-zone rule shapes retain fast paths with RDATE/EXDATE or COUNT. (2.2.7) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.7)
- Queries on rules without COUNT can visit only recurrence periods around the query for supported shapes, making next(), previous(), between(), matches(), and occursOn() faster; unsupported shapes retain the existing path. (2.2.7) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.7)
- Time zone tables are built from Temporal transitions instead of daily Intl probes, speeding setup and preventing long-running processes from slowing exponentially as tables expand. (2.2.7) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.7)

### Fixes and other changes

- With includeDtstart: true, DTSTART is no longer dropped when BYSETPOS excludes it; it is emitted and counted within COUNT across generation and query methods. (2.2.8) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.8)
- Quoted TZID parameter values are now accepted when parsing DTSTART, EXDATE, and RDATE; toString() still writes TZID without quotes. (2.2.8) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.8)
- Fast paths now agree with the general engine on the polyfill, avoiding different instants from all() and all(callback) for some named-zone rules. (2.2.7) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.7)
- Monthly rules no longer return a date twice when positive and negative positions select the same candidate. (2.2.7) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.7)
- Named-zone monthly BYSETPOS no longer ranks a nonexistent time during a daylight-saving transition. (2.2.7) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.7)
- The query no longer forces an aligned query anchor into the recurrence set when includeDtstart is enabled; query methods consistently retain the real DTSTART. (2.2.6) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.6)
- Query anchors and optimized output preserve calendars, and period bounds use the candidates' timezone and calendar. (2.2.6) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.6)
- Weekly and period generation no longer drifts wall time or creates skipped time slots after gaps and phantom HOURLY occurrences during fall-back; calendar folds use the first instant. (2.2.6) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.6)
- DAILY INTERVAL cadence is preserved through weekday filters in general generation and optimized generation and queries. (2.2.6) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.6)
- Missing inherited dates in MONTHLY and YEARLY rules are omitted without consuming COUNT or changing later occurrences; January 31 and February 29 retain their calendar behavior. (2.2.6) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.6)
- Native Temporal reads exact timezone transitions; the polyfill fallback probes daily, avoiding transitions shifted by input milliseconds or missed by fifteen-day sampling. (2.2.6) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.6)
- Mixed positive and negative week numbers are ordered before streaming and COUNT; query bounds include week-year spillover, with WKST and non-ISO year lengths respected. (2.2.6) — [release notes](https://github.com/ggaabe/rrule-temporal/releases/tag/v2.2.6)
