Releases: bxparks/AceTime
Releases · bxparks/AceTime
4.1.0 - ZonedExtra::resolved()
v4.0.0 - LocalXxx to PlainXxx; add 2025 versions of zonedb; replace 'fold'
- 4.0.0 (2025-10-21, TZDB version 2025b)
- See MIGRATING.md on breaking API changes, and how to
migrate. - Breaking Rename LocalXxx to PlainXxx, following the conventions
used by more modern timezone libraries (JavaScript Temporal, Python
whenever).- LocalDate -> PlainDate
- LocalDateTime -> PlainDateTime
- LocalTime -> PlainTime
- Backwards compatibility macros and methods have been added:
#define LocalDate PlainDate#define LocalDateTime PlainDateTime#define LocalTime PlainTime
- Breaking Rename various methods with 'Local' to 'Plain':
ZonedDateTime::localDateTime()->plainDateTime()ZonedDateTime::forLocalDateTime()->forPlainDateTime()ZonedExtra::forLocalDateTime()->forPlainDateTime()OffsetDateTime::localDateTime()->plainDateTime()OffsetDateTime::localDate()->plainDate()OffsetDateTime::localTime()->plainTime()PlainDateTime::localDate()->plainDate()PlainDateTime::localTime()->plainTime()- The old methods are retained for backwards compatibility, but are
marked as deprecated.
- Breaking Replace output parameter
foldwithresolved:ZonedDateTime::foldbecomesZonedDateTime::resolvedOffsetDateTime::foldbecomesOffsetDateTime::resolvedPlainDateTime::foldbecomesPlainDateTime::resolvedPlainTime::foldbecomesPlainTime::resolved
- Breaking Replace input parameter
foldwithdisambiguatein the
following methods:ZonedDateTime::forComponents()ZonedDateTime::forPlainDateTime()ZonedDateTime::normalize()ZonedExtra::forComponents()ZonedExtra::forPlainDateTime()
- Add 2 more zonedb databases
zonedb2025- same as
zonedb, but using transition rules for 2025 and onwards - used with
BasicZoneManagerand `BasicZoneProcessor - larger than
zonedbbecause it supports more zones than
zonedb(almost all zones in the TZDB, except maybe 7 zones)
- same as
- zonedbx2025
- same as zonedbx, but using transition rules for 2025 and onwards
- used with
ExtendedZoneManagerand `ExtendedZoneProcessor - smaller than
zonedbx(by around 10 kB) because it only
includes transitions after 2025
- See MIGRATING.md on breaking API changes, and how to
v3.0.0 - upgrade to TZDB 2025b; simplify ZoneInfo
- 3.0.0 (2025-04-25, TZDB version 2025b)
- upgrade to TZDB 2025a
- Paraguay adopts permanent -03 starting spring 2024.
- Improve pre-1991 data for the Philippines.
- Etc/Unknown is now reserved.
- upgrade to TZDB 2025b
- New zone for Aysn Region in Chile which moves from -04/-03 to -03.
(Creates new zone named America/Coyhaique)
- New zone for Aysn Region in Chile which moves from -04/-03 to -03.
- breaking add ZoneInfo data classes and their brokers into
Info
container class- allows selection of parallel class hierarchies using the
Info
container class basic::ZoneInfoclass moves tobasic::Info::ZoneInfoextended::ZoneInfoclass moves toextended::Info::ZoneInfocomplete::ZoneInfoclass moves tocomplete::Info::ZoneInfo
- allows selection of parallel class hierarchies using the
- breaking move
daysUntil(LocalDate, month, day)to
LocalDate::daysUntil(month, day)for simplicity - See Migrating to v3.0 for more
details.
- upgrade to TZDB 2025a
2.4.0 - support %z; upgrade to TZDB 2024b
- 2.4.0 (2024-12-13, TZDB version 2024b)
- Support new
%zvalue in FORMAT column. - Upgrade TZDB to 2024b
- https://lists.iana.org/hyperkitty/list/[email protected]/thread/IZ7AO6WRE3W3TWBL5IR6PMQUL433BQIE/
- "Improve historical data for Mexico, Mongolia, and Portugal. System V
names are now obsolescent. The main data form now uses %z. The code
now conforms to RFC 8536 for early timestamps. Support POSIX.1-2024,
which removes asctime_r and ctime_r. Assume POSIX.2-1992 or later for
shell scripts. SUPPORT_C89 now defaults to 1."
- Support new
- 2.3.2 (2024-07-25, TZDB version 2024a)
2.3.2 - upgrade to TZDB 2024a
- 2.3.2 (2024-07-25, TZDB version 2024a)
- Upgrade TZDB to 2024a
- https://mm.icann.org/pipermail/tz-announce/2024-February/000081.html
- "Kazakhstan unifies on UTC+5 beginning 2024-03-01. Palestine springs
forward a week later after Ramadan. zic no longer pretends to support
indefinite-past DST. localtime no longer mishandles Ciudad Jurez in
2422."
- Increase minimum python version to 3.10.
- Upgrade TZDB to 2024a
2.3.1 - upgrade to TZDB 2023d
- 2.3.1 (2024-01-12, TZDB version 2023d)
- Upgrade TZDB to 2023d
- https://mm.icann.org/pipermail/tz-announce/2023-December/000080.html
- "Ittoqqortoormiit, Greenland changes time zones on 2024-03-31. Vostok,
Antarctica changed time zones on 2023-12-18. Casey, Antarctica changed
time zones five times since 2020. Code and data fixes for Palestine
timestamps starting in 2072. A new data file zonenow.tab for
timestamps starting now."
- Upgrade TZDB to 2023d
2.3.0 - add CompleteZoneManager, zonedbc to extend timezone year range to [0001,10000)
Major Changes in v2.3: Add CompleteZoneProcessor, CompleteZoneManager,
and the zonedbc database to support all timezones, for all transitions defined
in the IANA TZ database ([1844,2087]), and extending the validity of timezone
calculations from [2000,10000) to [0001,10000).
Migration: MIGRATING.md
Changelog
- 2.3.0 (2023-06-27, TZDB version 2023c)
- Create CustomZoneRegistry example
to illustrate how to use a custom registry. - Update
BasicZoneManagerto detect gaps.- Allows
AceTimeValidation/validationtests to pass. - Still not able to distinguish between exact and overlap though.
- Allows
- Allow multi-character
ZoneRule.letterinBasicZoneProcessor.- Regenerate
zonedbwhich enables 2 more zones:/Africa/Windhoek,
andAmerica/Belize - Increases
zonedbby 150-200 bytes.
- Regenerate
- Rename
BrokerFactorytoZoneInfoStorefor better self-documentation.- This is an internal implementation detail. Downstream clients should
not be affected.
- This is an internal implementation detail. Downstream clients should
ZoneContext- Move
ZoneContext,letters[],fragments[]into PROGMEM. - Move
zonedbXxx::kTzDatabaseVersionstring into PROGMEM, and change
type toconst __FlashString*. - Create
ZoneContextBrokeraroundZoneContext, for consistency
with all other zoneinfo data structures. MergeZoneContext.hinto
ZoneInfo.h. - Add
startYearAccurateanduntilYearAccuratetoZoneContextwhich
define the interval of accurate transitions. - Saves around 150-200 bytes of RAM on AVR processors,
200-350 bytes of RAM on ESP8266.
- Move
- Cleanly separate zoneinfo storage classes from their brokers classes.
- Three storage implementations instead of one:
zoneinfolow,
zoneinfomid,zoneinfohigh, supporting low, middle, and high time
resolutions. zoneinfohighwas created to supportCompleteZoneProcessor,
CompleteZoneManagerand thezonedbcdatabase.zoneinfomidinitially used inExtendedZoneProcessor, but now
unused.- Merge
zoneinfo/ZonePolicy.hintozoneinfo/ZoneInfo.h. - Convert structs in
zoneinfo/ZoneInfo.incinto templates, with
synthetictypename Sselector. MergeZoneInfo.incinto
ZoneInfo.h.
- Three storage implementations instead of one:
- Support timezones before 1972 using
CompleteZoneManager,
CompleteZoneProcessor, andzonedbcdatabase- Before standardizing on UTC around 1970, many timezones had local
times offsets from UTC which require one-second resolution instead of
one-minute resolution. This requires changing many internal variables
fromint16_ttoint32_t. - Change
TimeOffsetto support one-second resolution usingint32_t. - Rename
BasicZone::stdOffseMinutes()toBasicZone::stdOffset()
which returns aTimeOffsetobject. - Rename
ExtendedZone::stdOffseMinutes()to
ExtendedZone::stdOffset()which returns aTimeOffsetobject. - Leave
BasicZoneProcessorusing one-minute resolution because its
algorithm has an inherent limitations which cannot handle many
timezones before 1972, so no need to convertint16_ttoint32_t
fields. - Add
CompleteZoneManager,CompleteZoneProcessor,
CompleteZoneProcessorCache,CompleteZone - Add
zonedbcdatabase which is valid from[1800,10000), which
includes all transitions in the TZDB since the first transition is
1844. - Add
scope=completeto access thezonedbcdatabase.
- Before standardizing on UTC around 1970, many timezones had local
- Zone Processor with graceful degradation
- Remove range checks against
ZoneContext.startYear()and
ZoneContext.untilYear() - Replace with
LocalDate::kMinYearandLocalDate::kMaxYear, mostly
for formatting reasons (prevent negative
years, and years with more than 4 digits). - The zone processors will always return something reasonble across the
entireint16_trange. - Only the accuracy suffers outside of the
startYearAccurate()and
untilYearAccurate()limits. - Along with v2.2 which always generates anchor rules for all zone
policies, thestartYearAccureate()anduntilYearAccurate()allows
for graceful degradation of classes likeZonedDateTimefor years
outside of this accuracy range.
- Remove range checks against
- Rename
src/tzonedb*directories- to
src/zonedb*testingfor consistency with other acetime libraries
- to
- Create CustomZoneRegistry example
2.2.3 - auto zone processor cache invalidation; add SAMD21, SAMD51 back into Tier 1 suport
- 2.2.3 (2023-05-31, TZDB version 2023c)
- Update
ace_time/testing/*classes to support splitting the test data
into 2 separate lists:transitionsandsamples.- Required to support new
validation_data.jsonfrom AceTimeValidation.
- Required to support new
- Update
AceTimeValidationtest names totests/Xxx{Basic,Extended}Test. - Add
ZonedExtra::kAbbrevSizeto define thecharbuffer size needed to
hold an abbreviation. - Change
ZonedExtra::kInvalidMinutesfrom public to private.- This is an implementation detail.
- Use
ZonedExtra::isError()instead.
- Rename AceTimePython to acetimepy.
- ZoneProcessor transition cache
- Save the epoch year, and automatically invalidate and regenerate the
cache when theEpoch::currentEpochYear()is modified. - Remove cache invalidation methods which are no longer needed:
ZoneProcessor::resetTransitionCache()ZoneProcessorCache::resetZoneProcessors()ZoneManager::resetZoneProcessors()
- Save the epoch year, and automatically invalidate and regenerate the
- Rename "Converter Epoch" to "Internal Epoch".
- Change
daysToCurrentEpochFromConverterEpoch()to
daysToCurrentEpochFromInternalEpoch(). - This is an internal implementation detail, exposed only for testing
purposes.
- Change
- Update supported boards and tiers
- Add SAMD21 and SAMD51 boards to Tier 1
- Add Adafruit ItsyBitsy M4 (SAMD51 120MHz ARM Cortex-M4)
- SAMD21 and SAMD51 boards are back in Tier 1, as long as they use
the traditional Arduino API instead of the new
Arduino-Core. - Fortunately most third party SAMD21 and SAMD51 boards continue to
use the traditional Arduino API.
- Move Teensy 3.2 to Tier 2
- This board is entering end-of-life.
- As well, the Teensyduino environment integrates with the Arduino
IDE and CLI in a way that's different than all other third-party
Arduino boards. Some of my automation scripts do not work with
Teensyduino, so it becomes very time consuming to test the Teensy
boards. - All Teensy boards are now in Tier 2 ("Should work but not tested
often").
- Add SAMD21 and SAMD51 boards to Tier 1
- Update
2.2.2 - upgrade to TZDB 2023c
- 2.2.2 (2023-04-01, TZDB version 2023c)
- Upgrade TZDB from 2023b to 2023c.
- https://mm.icann.org/pipermail/tz-announce/2023-March/000079.html
- "This release's code and data are identical to 2023a. In other
words, this release reverts all changes made in 2023b other than
commentary, as that appears to be the best of a bad set of
short-notice choices for modeling this week's daylight saving
chaos in Lebanon."
- "This release's code and data are identical to 2023a. In other
- https://mm.icann.org/pipermail/tz-announce/2023-March/000079.html
- AceTime is forced to upgrade to 2023c, because we skipped 2023a and went
directly to 2023b, which is being rolled back by 2023c.
- Upgrade TZDB from 2023b to 2023c.
2.2.1 - upgrade to TZDB 2023b; immutable TimeZone; support SAMD21 again
- 2.2.1 (2023-03-24, TZDB version 2023b)
- Actually regenerate the
zonedb*files to 2023b.
- Actually regenerate the
- 2.2.0 (2023-03-24, TZDB version 2023b)
- Upgrade TZDB from 2022g to 2023b
- 2023a skipped because it came out only a day earlier.
- 2023a: https://mm.icann.org/pipermail/tz-announce/2023-March/000077.html
- Egypt now uses DST again, from April through October.
- This year Morocco springs forward April 23, not April 30.
- Palestine delays the start of DST this year.
- Much of Greenland still uses DST from 2024 on.
- America/Yellowknife now links to America/Edmonton.
- tzselect can now use current time to help infer timezone.
- The code now defaults to C99 or later.
- Fix use of C23 attributes.
- 2023b: https://mm.icann.org/pipermail/tz-announce/2023-March/000078.html
- Lebanon delays the start of DST this year.
- Bug Fix
- Change arguments for
TimeZone::forMinutes()fromuint8_tto
uint16_t.
- Change arguments for
- Breaking Change
- Make
TimeZoneeffectively immutable, by removingsetStdOffset()
andsetDstOffset()methods. - Client applications should create a new
TimeZoneobject using
TimeZone::forTimeOffset(std, dst)and overwrite the old one. - See Migrating to v2.2.
- Make
- Add support for Seeed Studio XIAO M0 (SAMD21).
- Required updating
zoneino/compat.hto clobber the broken definition
ofFPSTR()in Seeeduino 1.8.3.
- Required updating
- Simplify the handling of
Rule.LETTER.- Encode all letters as an index into
ZoneContext.lettersarray, not
justLETTERwhich are only a single character. - On 8-bit AVR:
- Increases
BasicZoneProcessorby ~200 bytes when 1-2 zones are
used. But flash remains the same when the full TZ database is
used. - No change to
ExtendedZoneProcessorfor 1-2 zones. But decreases
flash usage by ~300 bytes when the full TZ database is used.
- Increases
- The small increase in flash is worth it because this greatly
simplifies the complicated code surrounding LETTER that was difficult
to understand and maintain.
- Encode all letters as an index into
- Unify Basic and Extended zoneinfo encoding.
- Change encoding of
basic::ZoneRule.deltaCode,
basic::ZoneEra.deltaCode, andbasic::ZoneEra.offsetCodeto be
identical their counterparts inextended::ZoneXxx. - Merge
BasicBrokers.handExtendedBrokers.hinto justBrokers.h.
- Change encoding of
- Restructure zonedb directories
- Lift
ace_time/internal/testing/tzonedb[x]database files
toace_time/tzonedb[x]. - Lift
ace_time/zonedb[x]database files toace_time/zonedb[x]. - These changes are transparent to client apps because the C++
namespaces of these files are unchanged. - Lift
ace_time/internal/Zone*.hfiles into newsrc/zoneinfo/
directory. These are the classes that describe the*zonedb*
databases.
- Lift
- Add
ZonedDateTime::offsetDateTime()- Returns the underlying
OffsetDateTimeinside theZonedDateTime. - Analogous to
ZonedDateTime::localDateTime().
- Returns the underlying
- Always generate anchor rules in zonedb.
- Allows
ExtendedZoneProcessorto work over all years[0,10000)
even with truncated zonedb (e.g.[2000,2100)). - Accuracy is guaranteed only for the requested interval (e.g.
[2000,2100). - But the code won't crash outside of that interval.
- Allows
- Upgrade TZDB from 2022g to 2023b