# Changelog

## [Unreleased]

## [2.6.0] - 2025-04-25

### Added

- Bengali (bn) localization [#159](https://github.com/rlanvin/php-rrule/pull/159)
- Danish (da) localization [#161](https://github.com/rlanvin/php-rrule/pull/161)
- Greek (el) localization [#157](https://github.com/rlanvin/php-rrule/pull/157)
- Russian (ru) localization [#153](https://github.com/rlanvin/php-rrule/pull/153)

## [2.5.2] - 2025-02-21

### Fixed

- Fix "november" typo in french translation [#155](https://github.com/rlanvin/php-rrule/issues/155)
- Fix incorrect calculation from partially filled cache [#160](https://github.com/rlanvin/php-rrule/issues/160)

## [2.5.1] - 2024-06-23

### Fixed

- Fix insufficient type detection for FREQ and WKST leading to deprecation warning in tests with PHP 8.3 [#149](https://github.com/rlanvin/php-rrule/pull/149)
- Fix failing tests with ICU 72.1 because of NNBSP
- Fix C.UTF8 locale support when intl isn't installed

## [2.5.0] - 2024-06-08

### Fixed

- Swedish: Corrects the spelling of monday and the grammar of enumeration partials. [#134](https://github.com/rlanvin/php-rrule/pull/134)
- Spanish: Improve clarity in daily and weekly recurrence translation [#147](https://github.com/rlanvin/php-rrule/pull/147)
- Dutch: weekdays and months are written in lowercase [#136](https://github.com/rlanvin/php-rrule/pull/136)
- Better handle TZ with Exchange / M365 generated iCal files [#143](https://github.com/rlanvin/php-rrule/pull/143)

### Added

- Human readable time of day option [#124](https://github.com/rlanvin/php-rrule/pull/124)
- Japanese translation [#139](https://github.com/rlanvin/php-rrule/pull/139)
- Czech translation [#137](https://github.com/rlanvin/php-rrule/pull/137)

## [2.4.1] - 2023-06-07

### Fixed

- Correctly parse `DateTimeImmutable` [#132](https://github.com/rlanvin/php-rrule/pull/132)
- Fix namespace on return type [#130](https://github.com/rlanvin/php-rrule/pull/130)
- Humanreadable gets monthly wrong [#129](https://github.com/rlanvin/php-rrule/pull/129)

## [2.4.0] - 2023-01-06

### Fixed

- Exclude files from dist packages [#110](https://github.com/rlanvin/php-rrule/pull/110)
- Improve German translation [#112](https://github.com/rlanvin/php-rrule/issues/112)
- Daylight Saving Time issue with PHP 8.1 [#120](https://github.com/rlanvin/php-rrule/issues/120)

### Added

- Added Portuguese translation [#108](https://github.com/rlanvin/php-rrule/pull/108)
- Added Polish translation [#106](https://github.com/rlanvin/php-rrule/pull/106)

## [2.3.2] - 2022-05-03

### Fixed

- Fix timezone (and the entire rule) changed to uppercase if rule was created using `createdFromRfcString` [#103](https://github.com/rlanvin/php-rrule/issues/103)

## [2.3.1] - 2022-04-22

### Fixed

- Fix microseconds not always removed from dtstart, causing date comparison issues with specific date input [#104](https://github.com/rlanvin/php-rrule/issues/104)

## [2.3.0] - 2021-10-25

### Added

- Added Swedish translation [#96](https://github.com/rlanvin/php-rrule/pull/96/)
- Added `bin/review_translations.php` as a helper for translators and contributors
- Added Hebrew translation [#95](https://github.com/rlanvin/php-rrule/pull/95)

### Fixed

- Fix Finnish translation [#94](https://github.com/rlanvin/php-rrule/issues/94)
- Update French translation
- Update German translation
- Fix compatibility with PHP 8.1 [#100](https://github.com/rlanvin/php-rrule/pull/100)

## [2.2.2] - 2021-01-09

### Fixed

- Fix `getOccurrencesAfter` returns empty array when `$inclusive` is `false` and `$limit` is not set [#93](https://github.com/rlanvin/php-rrule/pull/93)

## [2.2.1] - 2020-12-09

### Fixed

- Fix support for `DateTimeImmutable` [#90](https://github.com/rlanvin/php-rrule/issues/90)

## [2.2.0] - 2019-11-01

### Added

- Persian (Farsi) translation [#72](https://github.com/rlanvin/php-rrule/pull/72)
- Support for Windows timezone [#69](https://github.com/rlanvin/php-rrule/issues/69)

### Fixed

- Fix valid rules wrongly detected as not producing results, and cut short after MAX_CYCLES [#78](https://github.com/rlanvin/php-rrule/issues/78)
- Fix `RRule::createFromRfcString` not detecting RSet properly if the rule was lowercase
- [internal] Replace static variables by array constants (permitted since PHP 5.6). Shouldn't break backward compatibility unless you were doing weird things with this lib in the first place.

## [2.1.0] - 2019-05-30

### Fixed

- Fix locale format for i18n files without `intl` extension [#67](https://github.com/rlanvin/php-rrule/issues/67)

### Added

- Added new methods to `RSet`: `removeDate`, `clearDates`, `removeExDate` and `clearExDates` [#66](https://github.com/rlanvin/php-rrule/pull/66)

## [2.0.0] - 2019-03-16

- Add support for PHP 7.3

## [2.0.0-rc1] - 2019-01-13

- Rewrite the core algorithm to use a native PHP generator, drop compatibility with PHP < 5.6 [#43](https://github.com/rlanvin/php-rrule/issues/43)

### Added

- New option `custom_path` to `humanReadable()` to use custom translation files [#56](https://github.com/rlanvin/php-rrule/issues/56)
- New helpers methods [#60](https://github.com/rlanvin/php-rrule/issues/60)
  - `getOccurrencesBefore`
  - `getOccurrencesAfter`
  - `getNthOccurrencesBefore`
  - `getNthOccurrencesAfter`
  - `getNthOccurrencesFrom`

## [1.6.3] - 2019-01-13

### Fixed

- Fix error when timezone is an offset instead of an olson name. [#61](https://github.com/rlanvin/php-rrule/issues/61)
- Fix VALUE is a valid param of EXDATE [#62](https://github.com/rlanvin/php-rrule/issues/62)

## [1.6.2] - 2018-09-18

### Fixed

- Fix typo in NL translation [#53](https://github.com/rlanvin/php-rrule/issues/53)

## [1.6.1] - 2018-04-13

### Fixed

- Null check to prevent 0 (false) values being lost when exporting to RFC string [#50](https://github.com/rlanvin/php-rrule/pull/50)
- Fix warning in `humanReadable()` [#44](https://github.com/rlanvin/php-rrule/pull/44)
- Fix typo in NL translation [#46](https://github.com/rlanvin/php-rrule/pull/46)

## [1.6.0] - 2017-10-11

### Added

- German translation [#38](https://github.com/rlanvin/php-rrule/pull/38)
- Add `include_until` option to `humanReadable` to omit the "until" part of the rule [#36](https://github.com/rlanvin/php-rrule/pull/36)

## [1.5.1] - 2017-05-15
### Fixed

- Throw exception when passing a float instead of an int (e.g. INTERVAL=1.5) instead of casting silently
- Variable name typo [#34](https://github.com/rlanvin/php-rrule/issues/34)

## [1.5.0] - 2017-05-07

### Added

- Add `explicit_infinite` and `include_start` options to `humanReadable` to respectivity omit "forever" and the start date from the sentence.
- RSet constructor now accepts a string to build a RSET from a RFC string [#26](https://github.com/rlanvin/php-rrule/issues/26)
- New factory method `RRule::createFromRfcString()` to build either a RRule or a RSet from a string
- Add a `$limit` parameter to `getOccurrences()` and `getOccurrencesBetween()` to make working with infinite rule easier
- Add a `$dtstart` parameter to `RRule` and `RSet` constsructor to specify dtstart when working with a RFC string without DTSTART.

### Fixed

- When creating a RRule, the RFC parser will not accept multiple DTSTART or RRULE lines

### Deprecated

- `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.

## [1.4.2] - 2017-03-29

### Fixed

- `humanReadable()` fails if the RRule was created from a RFC string containing the timezone (e.g. `DTSTART;TZID=America/New_York:19970901T090000`)

## [1.4.1] - 2017-02-02

### Fixed

- `RRule::offsetGet` and `RSet::offsetGet` throw `InvalidArgumentException` for illegal offset types [#22](https://github.com/rlanvin/php-rrule/issues/22)
- Update exception message for UNTIL parse error [#23](https://github.com/rlanvin/php-rrule/pull/23)
- Fix parser handling of UNTIL when DTSTART is not provided [#25](https://github.com/rlanvin/php-rrule/issues/25)
- Accept invalid RFC strings generated by the JS lib but triggers a Notice message [#25](https://github.com/rlanvin/php-rrule/issues/25)
- Rework `RRule::i18nLoad()` to accept locales such as `en_sg` and use `Locale::parseLocale` when possible [#24](https://github.com/rlanvin/php-rrule/issues/24)
- Fix `humanReadable` fails with `intl` enabled when the timezone is "Z" [#24](https://github.com/rlanvin/php-rrule/issues/24)

## [1.4.0] - 2016-11-11

### Added

- Add `RRule::getRule()` method to return original rule array [#17](https://github.com/rlanvin/php-rrule/pull/17)
- Add `RSet::getRRules()`, `RSet::getExRules()`, `RSet::getDates()` and `RSet::getExDates()`
- Tests for PHP 7.0

### Fixed

- Fix a bug in `rfcString` when using a frequency constant (instead of a string) to create the rule [#16](https://github.com/rlanvin/php-rrule/pull/16)
- Fix a undefined index bug in RFC parser

## [1.3.1] - 2016-08-09

### Added

- Italian translation (it) [#14](https://github.com/rlanvin/php-rrule/pull/14)

### Fixed

- Fixed a bug when combining values with an integer modifier and regular values in `BYDAY` (example `1MO,FR`)
- Fixed RRule created with a timestamp start date generates an invalid RFC string [#15](https://github.com/rlanvin/php-rrule/issues/15)

## [1.3.0] - 2016-07-08

### Added

- Spanish translation (es) [#12](https://github.com/rlanvin/php-rrule/pull/12)
- `$include_timezone` parameter to `RRule::rfcString()` to produce a RFC string without timezone information

### Fixed

- `RRule::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). [#13](https://github.com/rlanvin/php-rrule/issues/13)

## [1.2.0] - 2016-04-09

### Added

- Support for fallback locale when using `RRule::humanReadable()` [#11](https://github.com/rlanvin/php-rrule/pull/11)
- Dutch translation (nl) [#9](https://github.com/rlanvin/php-rrule/pull/9)

### Fixed

- Fixed fatal error Locale class not found when intl extension is not loaded [#10](https://github.com/rlanvin/php-rrule/issues/10)

## [1.1.0] - 2016-03-30

### Added

- New class `RRule\RSet` (recurrence set) that can combine multiple RRULE, EXRULE, RDATE and EXDATE. [#7](https://github.com/rlanvin/php-rrule/issues/7)
- New interface `RRule\RRuleInterface` to unify `RRule` and `RSet`
- New methods: `isFinite()`, `isInfinite()`

### Fixed

- Fix bug preventing the iteration of multiple instances of RRule at the same time
- Fix `occursAt` failing when the date passed was a different timezone [#8](https://github.com/rlanvin/php-rrule/pull/8)
- Fix bug at WEEKLY frequency with a partially filled cache in some circumstances
- Fix various reference bugs causing corruption of the cache in some circumstances (related to DateTime object being mutable)

### Removed

- The alias `RRule::occursOn` has been removed (use `occursAt` instead)

## [1.0.1] - 2016-03-11

### Fixed

- Ensure the results are returned in the same timezone as DTSTART. [#6](https://github.com/rlanvin/php-rrule/issues/6)
- LogicException namespacing bug. [#3](https://github.com/rlanvin/php-rrule/issues/3)

## 1.0.0 - 2016-03-02

### Added

- First release, everything before that was unversioned (`dev-master` was used).

[Unreleased]: https://github.com/rlanvin/php-rrule/compare/v2.6.0...HEAD
[2.6.0]: https://github.com/rlanvin/php-rrule/compare/v2.5.2...v2.6.0
[2.5.2]: https://github.com/rlanvin/php-rrule/compare/v2.5.1...v2.5.2
[2.5.1]: https://github.com/rlanvin/php-rrule/compare/v2.5.0...v2.5.1
[2.5.0]: https://github.com/rlanvin/php-rrule/compare/v2.4.1...v2.5.0
[2.4.1]: https://github.com/rlanvin/php-rrule/compare/v2.4.0...v2.4.1
[2.4.0]: https://github.com/rlanvin/php-rrule/compare/v2.3.2...v2.4.0
[2.3.2]: https://github.com/rlanvin/php-rrule/compare/v2.3.1...v2.3.2
[2.3.1]: https://github.com/rlanvin/php-rrule/compare/v2.3.0...v2.3.1
[2.3.0]: https://github.com/rlanvin/php-rrule/compare/v2.2.2...v2.3.0
[2.2.2]: https://github.com/rlanvin/php-rrule/compare/v2.2.1...v2.2.2
[2.2.1]: https://github.com/rlanvin/php-rrule/compare/v2.2.0...v2.2.1
[2.2.0]: https://github.com/rlanvin/php-rrule/compare/v2.1.0...v2.2.0
[2.1.0]: https://github.com/rlanvin/php-rrule/compare/v2.0.0...v2.1.0
[2.0.0]: https://github.com/rlanvin/php-rrule/compare/v2.0.0-rc1...v2.0.0
[2.0.0-rc1]: https://github.com/rlanvin/php-rrule/compare/v1.6.3...v2.0.0-rc1
[1.6.3]: https://github.com/rlanvin/php-rrule/compare/v1.6.2...v1.6.3
[1.6.2]: https://github.com/rlanvin/php-rrule/compare/v1.6.1...v1.6.2
[1.6.1]: https://github.com/rlanvin/php-rrule/compare/v1.6.0...v1.6.1
[1.6.0]: https://github.com/rlanvin/php-rrule/compare/v1.5.1...v1.6.0
[1.5.1]: https://github.com/rlanvin/php-rrule/compare/v1.5.0...v1.5.1
[1.5.0]: https://github.com/rlanvin/php-rrule/compare/v1.4.2...v1.5.0
[1.4.2]: https://github.com/rlanvin/php-rrule/compare/v1.4.1...v1.4.2
[1.4.1]: https://github.com/rlanvin/php-rrule/compare/v1.4.0...v1.4.1
[1.4.0]: https://github.com/rlanvin/php-rrule/compare/v1.3.1...v1.4.0
[1.3.1]: https://github.com/rlanvin/php-rrule/compare/v1.3.0...v1.3.1
[1.3.0]: https://github.com/rlanvin/php-rrule/compare/v1.2.0...v1.3.0
[1.2.0]: https://github.com/rlanvin/php-rrule/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/rlanvin/php-rrule/compare/v1.0.1...v1.1.0
[1.0.1]: https://github.com/rlanvin/php-rrule/compare/v1.0.0...v1.0.1
