Skip to content

Releases: bxparks/AceTime

4.1.0 - ZonedExtra::resolved()

17 Nov 18:59
3dc2f58

Choose a tag to compare

  • 4.1.0 (2025-11-17, TZDB version 2025b)
    • Breaking Replace uint8_t ZonedExtra.type() with Resolved ZonedExtra.resolved()
      • ZonedExtra::resolved() has the same behavior and semantics as
        ZonedDateTime.resolved()

v4.0.0 - LocalXxx to PlainXxx; add 2025 versions of zonedb; replace 'fold'

21 Oct 21:53
9599d04

Choose a tag to compare

  • 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 fold with resolved:
      • ZonedDateTime::fold becomes ZonedDateTime::resolved
      • OffsetDateTime::fold becomes OffsetDateTime::resolved
      • PlainDateTime::fold becomes PlainDateTime::resolved
      • PlainTime::fold becomes PlainTime::resolved
    • Breaking Replace input parameter fold with disambiguate in 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 BasicZoneManager and `BasicZoneProcessor
        • larger than zonedb because it supports more zones than
          zonedb (almost all zones in the TZDB, except maybe 7 zones)
      • zonedbx2025
        • same as zonedbx, but using transition rules for 2025 and onwards
        • used with ExtendedZoneManager and `ExtendedZoneProcessor
        • smaller than zonedbx (by around 10 kB) because it only
          includes transitions after 2025

v3.0.0 - upgrade to TZDB 2025b; simplify ZoneInfo

26 Apr 00:47
c39124c

Choose a tag to compare

  • 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)
    • breaking add ZoneInfo data classes and their brokers into Info
      container class
      • allows selection of parallel class hierarchies using the Info
        container class
      • basic::ZoneInfo class moves to basic::Info::ZoneInfo
      • extended::ZoneInfo class moves to extended::Info::ZoneInfo
      • complete::ZoneInfo class moves to complete::Info::ZoneInfo
    • breaking move daysUntil(LocalDate, month, day) to
      LocalDate::daysUntil(month, day) for simplicity
    • See Migrating to v3.0 for more
      details.

2.4.0 - support %z; upgrade to TZDB 2024b

14 Dec 01:28
1e96820

Choose a tag to compare

  • 2.4.0 (2024-12-13, TZDB version 2024b)
  • 2.3.2 (2024-07-25, TZDB version 2024a)

2.3.2 - upgrade to TZDB 2024a

27 Jul 01:14
3ee151d

Choose a tag to compare

  • 2.3.2 (2024-07-25, TZDB version 2024a)
    • Upgrade TZDB to 2024a
    • Increase minimum python version to 3.10.

2.3.1 - upgrade to TZDB 2023d

12 Jan 21:35
373ce16

Choose a tag to compare

  • 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."

2.3.0 - add CompleteZoneManager, zonedbc to extend timezone year range to [0001,10000)

28 Jun 00:10
3e58e09

Choose a tag to compare

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 BasicZoneManager to detect gaps.
      • Allows AceTimeValidation/validation tests to pass.
      • Still not able to distinguish between exact and overlap though.
    • Allow multi-character ZoneRule.letter in BasicZoneProcessor.
      • Regenerate zonedb which enables 2 more zones: /Africa/Windhoek,
        and America/Belize
      • Increases zonedb by 150-200 bytes.
    • Rename BrokerFactory to ZoneInfoStore for better self-documentation.
      • This is an internal implementation detail. Downstream clients should
        not be affected.
    • ZoneContext
      • Move ZoneContext, letters[], fragments[] into PROGMEM.
      • Move zonedbXxx::kTzDatabaseVersion string into PROGMEM, and change
        type to const __FlashString*.
      • Create ZoneContextBroker around ZoneContext, for consistency
        with all other zoneinfo data structures. Merge ZoneContext.h into
        ZoneInfo.h.
      • Add startYearAccurate and untilYearAccurate to ZoneContext which
        define the interval of accurate transitions.
      • Saves around 150-200 bytes of RAM on AVR processors,
        200-350 bytes of RAM on ESP8266.
    • 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.
      • zoneinfohigh was created to support CompleteZoneProcessor,
        CompleteZoneManager and the zonedbc database.
      • zoneinfomid initially used in ExtendedZoneProcessor, but now
        unused.
      • Merge zoneinfo/ZonePolicy.h into zoneinfo/ZoneInfo.h.
      • Convert structs in zoneinfo/ZoneInfo.inc into templates, with
        synthetic typename S selector. Merge ZoneInfo.inc into
        ZoneInfo.h.
    • Support timezones before 1972 using CompleteZoneManager,
      CompleteZoneProcessor, and zonedbc database
      • 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
        from int16_t to int32_t.
      • Change TimeOffset to support one-second resolution using int32_t.
      • Rename BasicZone::stdOffseMinutes() to BasicZone::stdOffset()
        which returns a TimeOffset object.
      • Rename ExtendedZone::stdOffseMinutes() to
        ExtendedZone::stdOffset() which returns a TimeOffset object.
      • Leave BasicZoneProcessor using one-minute resolution because its
        algorithm has an inherent limitations which cannot handle many
        timezones before 1972, so no need to convert int16_t to int32_t
        fields.
      • Add CompleteZoneManager, CompleteZoneProcessor,
        CompleteZoneProcessorCache, CompleteZone
      • Add zonedbc database which is valid from [1800,10000), which
        includes all transitions in the TZDB since the first transition is
        1844.
      • Add scope=complete to access the zonedbc database.
    • Zone Processor with graceful degradation
      • Remove range checks against ZoneContext.startYear() and
        ZoneContext.untilYear()
      • Replace with LocalDate::kMinYear and LocalDate::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
        entire int16_t range.
      • Only the accuracy suffers outside of the startYearAccurate() and
        untilYearAccurate() limits.
      • Along with v2.2 which always generates anchor rules for all zone
        policies, the startYearAccureate() and untilYearAccurate() allows
        for graceful degradation of classes like ZonedDateTime for years
        outside of this accuracy range.
    • Rename src/tzonedb* directories
      • to src/zonedb*testing for consistency with other acetime libraries

2.2.3 - auto zone processor cache invalidation; add SAMD21, SAMD51 back into Tier 1 suport

01 Jun 03:02
403f08e

Choose a tag to compare

  • 2.2.3 (2023-05-31, TZDB version 2023c)
    • Update ace_time/testing/* classes to support splitting the test data
      into 2 separate lists: transitions and samples.
      • Required to support new validation_data.json from AceTimeValidation.
    • Update AceTimeValidation test names to tests/Xxx{Basic,Extended}Test.
    • Add ZonedExtra::kAbbrevSize to define the char buffer size needed to
      hold an abbreviation.
    • Change ZonedExtra::kInvalidMinutes from 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 the Epoch::currentEpochYear() is modified.
      • Remove cache invalidation methods which are no longer needed:
        • ZoneProcessor::resetTransitionCache()
        • ZoneProcessorCache::resetZoneProcessors()
        • ZoneManager::resetZoneProcessors()
    • Rename "Converter Epoch" to "Internal Epoch".
      • Change daysToCurrentEpochFromConverterEpoch() to
        daysToCurrentEpochFromInternalEpoch().
      • This is an internal implementation detail, exposed only for testing
        purposes.
    • 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").

2.2.2 - upgrade to TZDB 2023c

01 Apr 17:32
e580545

Choose a tag to compare

  • 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."
    • AceTime is forced to upgrade to 2023c, because we skipped 2023a and went
      directly to 2023b, which is being rolled back by 2023c.

2.2.1 - upgrade to TZDB 2023b; immutable TimeZone; support SAMD21 again

25 Mar 04:09

Choose a tag to compare

  • 2.2.1 (2023-03-24, TZDB version 2023b)
    • Actually regenerate the zonedb* files to 2023b.
  • 2.2.0 (2023-03-24, TZDB version 2023b)
    • Upgrade TZDB from 2022g to 2023b
    • Bug Fix
      • Change arguments for TimeZone::forMinutes() from uint8_t to
        uint16_t.
    • Breaking Change
      • Make TimeZone effectively immutable, by removing setStdOffset()
        and setDstOffset() methods.
      • Client applications should create a new TimeZone object using
        TimeZone::forTimeOffset(std, dst) and overwrite the old one.
      • See Migrating to v2.2.
    • Add support for Seeed Studio XIAO M0 (SAMD21).
      • Required updating zoneino/compat.h to clobber the broken definition
        of FPSTR() in Seeeduino 1.8.3.
    • Simplify the handling of Rule.LETTER.
      • Encode all letters as an index into ZoneContext.letters array, not
        just LETTER which are only a single character.
      • On 8-bit AVR:
        • Increases BasicZoneProcessor by ~200 bytes when 1-2 zones are
          used. But flash remains the same when the full TZ database is
          used.
        • No change to ExtendedZoneProcessor for 1-2 zones. But decreases
          flash usage by ~300 bytes when the full TZ database is used.
      • The small increase in flash is worth it because this greatly
        simplifies the complicated code surrounding LETTER that was difficult
        to understand and maintain.
    • Unify Basic and Extended zoneinfo encoding.
      • Change encoding of basic::ZoneRule.deltaCode,
        basic::ZoneEra.deltaCode, and basic::ZoneEra.offsetCode to be
        identical their counterparts in extended::ZoneXxx.
      • Merge BasicBrokers.h and ExtendedBrokers.h into just Brokers.h.
    • Restructure zonedb directories
      • Lift ace_time/internal/testing/tzonedb[x] database files
        to ace_time/tzonedb[x].
      • Lift ace_time/zonedb[x] database files to ace_time/zonedb[x].
      • These changes are transparent to client apps because the C++
        namespaces of these files are unchanged.
      • Lift ace_time/internal/Zone*.h files into new src/zoneinfo/
        directory. These are the classes that describe the *zonedb*
        databases.
    • Add ZonedDateTime::offsetDateTime()
      • Returns the underlying OffsetDateTime inside the ZonedDateTime.
      • Analogous to ZonedDateTime::localDateTime().
    • Always generate anchor rules in zonedb.
      • Allows ExtendedZoneProcessor to 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.