|
1 | 1 | # Changelog |
2 | 2 |
|
3 | 3 | - unreleased |
| 4 | +- 4.0.0 (2025-10-21, TZDB version 2025b) |
| 5 | + - See [MIGRATING.md](MIGRATING.md) on breaking API changes, and how to |
| 6 | + migrate. |
| 7 | + - **Breaking** Rename LocalXxx to PlainXxx, following the conventions |
| 8 | + used by more modern timezone libraries (JavaScript Temporal, Python |
| 9 | + whenever). |
| 10 | + - LocalDate -> PlainDate |
| 11 | + - LocalDateTime -> PlainDateTime |
| 12 | + - LocalTime -> PlainTime |
| 13 | + - Backwards compatibility macros and methods have been added: |
| 14 | + - `#define LocalDate PlainDate` |
| 15 | + - `#define LocalDateTime PlainDateTime` |
| 16 | + - `#define LocalTime PlainTime` |
| 17 | + - **Breaking** Rename various methods with 'Local' to 'Plain': |
| 18 | + - `ZonedDateTime::localDateTime()` -> `plainDateTime()` |
| 19 | + - `ZonedDateTime::forLocalDateTime()` -> `forPlainDateTime()` |
| 20 | + - `ZonedExtra::forLocalDateTime()` -> `forPlainDateTime()` |
| 21 | + - `OffsetDateTime::localDateTime()` -> `plainDateTime()` |
| 22 | + - `OffsetDateTime::localDate()` -> `plainDate()` |
| 23 | + - `OffsetDateTime::localTime()` -> `plainTime()` |
| 24 | + - `PlainDateTime::localDate()` -> `plainDate()` |
| 25 | + - `PlainDateTime::localTime()` -> `plainTime()` |
| 26 | + - The old methods are retained for backwards compatibility, but are |
| 27 | + marked as deprecated. |
| 28 | + - **Breaking** Replace output parameter `fold` with `resolved`: |
| 29 | + - `ZonedDateTime::fold` becomes `ZonedDateTime::resolved` |
| 30 | + - `OffsetDateTime::fold` becomes `OffsetDateTime::resolved` |
| 31 | + - `PlainDateTime::fold` becomes `PlainDateTime::resolved` |
| 32 | + - `PlainTime::fold` becomes `PlainTime::resolved` |
| 33 | + - **Breaking** Replace input parameter `fold` with `disambiguate` in the |
| 34 | + following methods: |
| 35 | + - `ZonedDateTime::forComponents()` |
| 36 | + - `ZonedDateTime::forPlainDateTime()` |
| 37 | + - `ZonedDateTime::normalize()` |
| 38 | + - `ZonedExtra::forComponents()` |
| 39 | + - `ZonedExtra::forPlainDateTime()` |
| 40 | + - Add 2 more zonedb databases |
| 41 | + - `zonedb2025` |
| 42 | + - same as `zonedb`, but using transition rules for 2025 and onwards |
| 43 | + - used with `BasicZoneManager` and `BasicZoneProcessor |
| 44 | + - *larger* than `zonedb` because it supports more zones than |
| 45 | + `zonedb` (almost all zones in the TZDB, except maybe 7 zones) |
| 46 | + - zonedbx2025 |
| 47 | + - same as zonedbx, but using transition rules for 2025 and onwards |
| 48 | + - used with `ExtendedZoneManager` and `ExtendedZoneProcessor |
| 49 | + - *smaller* than `zonedbx` (by around 10 kB) because it only |
| 50 | + includes transitions after 2025 |
4 | 51 | - 3.0.0 (2025-04-25, TZDB version 2025b) |
5 | 52 | - [upgrade to TZDB 2025a ](https://lists.iana.org/hyperkitty/list/[email protected]/thread/MWII7R3HMCEDNUCIYQKSSTYYR7UWK4OQ/) |
6 | 53 | - Paraguay adopts permanent -03 starting spring 2024. |
|
9 | 56 | - [upgrade to TZDB 2025b ](https://lists.iana.org/hyperkitty/list/[email protected]/thread/6JVHNHLB6I2WAYTQ75L6KEPEQHFXAJK3/) |
10 | 57 | - New zone for Aysén Region in Chile which moves from -04/-03 to -03. |
11 | 58 | (Creates new zone named America/Coyhaique) |
12 | | - - **breaking** add ZoneInfo data classes and their brokers into `Info` |
| 59 | + - **Breaking** Add ZoneInfo data classes and their brokers into `Info` |
13 | 60 | container class |
14 | 61 | - allows selection of parallel class hierarchies using the `Info` |
15 | 62 | container class |
16 | 63 | - `basic::ZoneInfo` class moves to `basic::Info::ZoneInfo` |
17 | 64 | - `extended::ZoneInfo` class moves to `extended::Info::ZoneInfo` |
18 | 65 | - `complete::ZoneInfo` class moves to `complete::Info::ZoneInfo` |
19 | | - - **breaking** move `daysUntil(LocalDate, month, day)` to |
20 | | - `LocalDate::daysUntil(month, day)` for simplicity |
| 66 | + - **Breaking** Move `daysUntil(PlainDate, month, day)` to |
| 67 | + `PlainDate::daysUntil(month, day)` for simplicity |
21 | 68 | - See [Migrating to v3.0](MIGRATING.md#MigratingToVersion300) for more |
22 | 69 | details. |
23 | 70 | - 2.4.0 (2024-12-13, TZDB version 2024b) |
|
105 | 152 | - Zone Processor with graceful degradation |
106 | 153 | - Remove range checks against `ZoneContext.startYear()` and |
107 | 154 | `ZoneContext.untilYear()` |
108 | | - - Replace with `LocalDate::kMinYear` and `LocalDate::kMaxYear`, mostly |
| 155 | + - Replace with `PlainDate::kMinYear` and `PlainDate::kMaxYear`, mostly |
109 | 156 | for formatting reasons (prevent negative |
110 | 157 | years, and years with more than 4 digits). |
111 | 158 | - The zone processors will always return something reasonble across the |
|
224 | 271 | databases. |
225 | 272 | - Add `ZonedDateTime::offsetDateTime()` |
226 | 273 | - Returns the underlying `OffsetDateTime` inside the `ZonedDateTime`. |
227 | | - - Analogous to `ZonedDateTime::localDateTime()`. |
| 274 | + - Analogous to `ZonedDateTime::plainDateTime()`. |
228 | 275 | - Always generate anchor rules in zonedb. |
229 | 276 | - Allows `ExtendedZoneProcessor` to work over all years `[0,10000)` |
230 | 277 | even with truncated zonedb (e.g. `[2000,2100)`). |
|
265 | 312 | - **New Class**: `ZonedExtra.h` |
266 | 313 | - `ZonedExtra::forEpochSeconds(epochSeconds, tz)` |
267 | 314 | - Create instance from epochSeconds and time zone. |
268 | | - - `ZonedExtra::forLocalDateTime(ldt, tz)` |
269 | | - - Create instance from LocalDateTime and time zone. |
| 315 | + - `ZonedExtra::forPlainDateTime(pdt, tz)` |
| 316 | + - Create instance from PlainDateTime and time zone. |
270 | 317 | - **Potentially Breaking**: Unified Links |
271 | 318 | - Links are now first-class citizens, exactly the same as Zones. |
272 | 319 | - Unify "fat links" and "symbolic links" into a single implementation. |
|
278 | 325 | - Simplify ZoneProcessors |
279 | 326 | - `ZoneProcessor.h`, `ExtendedZoneProcessor.h`, `BasicZoneProcessor.h` |
280 | 327 | - Remove: `getUtcOffset()`, `getDeltaOffset()`, `getAbbrev()` |
281 | | - - Replaced by: `findByLocalDateTime()`, `findByEpochSeconds()` |
| 328 | + - Replaced by: `findByPlainDateTime()`, `findByEpochSeconds()` |
282 | 329 | - These are internal helper methods not intended for public consumption. |
283 | 330 | - Unit tests |
284 | 331 | - Migrate most unit tests to use the smaller, testing zone databases at |
|
308 | 355 | - Change internal storage type of `year` component from `int8_t` to |
309 | 356 | `int16_t`, extending the range of valid years from [-1873,2127] to |
310 | 357 | [1,9999]. |
311 | | - - Remove `yearTiny()` getters and setters from `LocalDate`, |
312 | | - `LocalDateTime`, `OffsetDateTime`, and `ZonedDateTime`. |
| 358 | + - Remove `yearTiny()` getters and setters from `PlainDate`, |
| 359 | + `PlainDateTime`, `OffsetDateTime`, and `ZonedDateTime`. |
313 | 360 | - They were not documented except in doxygen docs. |
314 | | - - Remove from `LocalDate`: |
| 361 | + - Remove from `PlainDate`: |
315 | 362 | - `kInvalidYearTiny`, replaced with `kInvalidYear` |
316 | 363 | - `kMinYearTiny`, replaced with `kMinYear` |
317 | 364 | - `kMaxYearTiny`, replaced with `kMaxYear` |
318 | 365 | - `forTinyComponents()` |
319 | | - - Remove from `LocalDateTime` |
| 366 | + - Remove from `PlainDateTime` |
320 | 367 | - `forTinyComponents()` |
321 | 368 | - Update [AceTimeTools](https://github.com/bxparks/AceTimeTools) |
322 | 369 | to generate `src/zonedb` and `src/zonedbx` using `int16_t` year types. |
|
334 | 381 | wikipedia article https://en.wikipedia.org/wiki/Julian_day. |
335 | 382 | - `EpochConverterHinnant` implements the algorithms found in |
336 | 383 | https://howardhinnant.github.io/date_algorithms.html. |
337 | | - - Migrate `LocalDate` to use the `EpochConverterHinnant` instead of |
| 384 | + - Migrate `PlainDate` to use the `EpochConverterHinnant` instead of |
338 | 385 | `EpochConverterJulian`. |
339 | 386 | - The primary reason is that I am able to fully understand the |
340 | 387 | algorithms described in `EpochConverterHinnant`. |
|
413 | 460 | - ESP32 Core from 2.0.2 to 2.0.5 |
414 | 461 | - Teensyduino from 1.56 to 1.57 |
415 | 462 | - 1.11.4 (2022-08-13, TZDB 2022b) |
416 | | - - Add `ace_time::daysUntil(localDate, month, day)` utility function that |
| 463 | + - Add `ace_time::daysUntil(plainDate, month, day)` utility function that |
417 | 464 | returns the number of days until the next (month, day) date. Useful for |
418 | 465 | calculating the number of days until the next Christmas for example. |
419 | 466 | - Upgrade to TZDB 2022b. |
|
501 | 548 | and overlaps. |
502 | 549 | - The semantics of the `fold` parameter is intended to be identical to |
503 | 550 | [Python PEP 495](https://www.python.org/dev/peps/pep-0495). |
504 | | - - Add `LocalTime::fold()`, `LocalDateTime::fold()`, |
| 551 | + - Add `PlainTime::fold()`, `PlainDateTime::fold()`, |
505 | 552 | `OffsetDateTime::fold()`, `ZonedDateTime::fold()`. |
506 | 553 | - Update `ExtendedZoneProcessor::getOffsetDateTime(acetime_t)` to |
507 | 554 | calculate the `OffsetDateTime::fold()` as an output parameter. |
508 | 555 | - Update `ExtendedZoneProcessor::getOffsetDateTime(const |
509 | | - LocalDateTime&)` to handle `LocalDateTime::fold()` as an input |
| 556 | + PlainDateTime&)` to handle `PlainDateTime::fold()` as an input |
510 | 557 | parameter. |
511 | 558 | - Increases flash usage of `ExtendedZoneProcessor` by around 600 bytes |
512 | 559 | on AVR, and 400-600 bytes on 32-bit processors. |
513 | 560 | - Add `toUnixSeconds64()` and `forUnixSeconds64()` methods to |
514 | | - `LocalDate`, `LocalDateTime`, `OffsetDateTime`, `ZonedDateTime`. |
| 561 | + `PlainDate`, `PlainDateTime`, `OffsetDateTime`, `ZonedDateTime`. |
515 | 562 | - These use 64-bit `int64_t` integers, which allows Unix seconds to be |
516 | 563 | used up to 2068-01-19T03:14:07Z (which is the limit of these |
517 | 564 | various classes due to the internal use of 32-bit `acetime_t`). |
|
1009 | 1056 | - Add documentation of `TimeZoneData`, `TimeZone::toTimeZoneData()`, and |
1010 | 1057 | `ZoneManager::createFromTimeZoneData()` to `USER_GUIDE.md`. Looks like I |
1011 | 1058 | added the class in v0.5 but forgot to document it. |
1012 | | - - Implement `LocalDateTime::compareTo()` using only its components instead |
1013 | | - of internally converting to epochSeconds. Not all `LocalDateTime` can be |
| 1059 | + - Implement `PlainDateTime::compareTo()` using only its components instead |
| 1060 | + of internally converting to epochSeconds. Not all `PlainDateTime` can be |
1014 | 1061 | represented by an epochSeconds, so this change makes the algorithm more |
1015 | 1062 | robust. The semantics of the method should remain unchanged. |
1016 | | - - Update the doxygen docs of the `compareTo()` methods of `LocalDateTime`, |
1017 | | - `LocalTime`, `LocalDate`, `OffsetDateTime` and `ZonedDateTime` to clarify |
| 1063 | + - Update the doxygen docs of the `compareTo()` methods of `PlainDateTime`, |
| 1064 | + `PlainTime`, `PlainDate`, `OffsetDateTime` and `ZonedDateTime` to clarify |
1018 | 1065 | the semantics of those operations. |
1019 | 1066 | - 1.2.1 (2020-11-12, TZ DB version 2020d) |
1020 | 1067 | - No functional change in this release. Mostly documentation. |
|
1274 | 1321 | - Change `ZonedDateTime::printTo()` format to match Java Time format. |
1275 | 1322 | - Remove `friend` declarations not related to unit tests. |
1276 | 1323 | - Remove redundant definitions of `kInvalidEpochSeconds`, standardize on |
1277 | | - `LocalDate::kInvalidEpochSeconds`. |
| 1324 | + `PlainDate::kInvalidEpochSeconds`. |
1278 | 1325 | - Make `timeOffset` a required parameter for constructors and factory |
1279 | 1326 | methods `OffsetDateTime` instead of defaulting to `TimeOffset()`. |
1280 | 1327 | - Make `timeZone` a required parameter in constructors and factory methods |
|
0 commit comments