Repository: BurntSushi/jiff (language: rust)

Issue:
Document how `jiff-tzdb` data is generated
`concatenated-zoneinfo.dat` seems to include copied data for each alias, instead of pointing aliases at the data for the canonical zone. For example, `Europe/Kiev` and `Europe/Kyiv` point at different parts of the blob, even though `Europe/Kiev` is an alias in TZDB, so the data in both is the same.

There are 597 identifiers, but only 339 non-alias zones in 2025a, so 45% of the data is probably duplicated.

It would also be useful to document which TZDB options are used when generating this file, e.g. backzone for including backzone zones, rearguard for normalizing DSTs to be positive (Ireland), etc.




Discussion / hints:
This is how `zic` is invoked to build tzdb: https://github.com/BurntSushi/jiff/blob/e094b01adfc0faaeb78f2cf0b4888b028c686bee/crates/jiff-cli/cmd/generate/zoneinfo.rs#L124-L137

And this is where the resulting zoneinfo is traversed and embedded into the `dat` file: https://github.com/BurntSushi/jiff/blob/e094b01adfc0faaeb78f2cf0b4888b028c686bee/crates/jiff-cli/cmd/generate/tzdb.rs#L66

I believe it's all pretty dumb at the moment and doesn't try to do anything clever with aliases and what not.
I've discovered an issue around Ireland's weird DST. The tzdb says that Ireland does negative DST in the winter, and normal time in the summer, *unless* you build it with the `rearguard` feature, in which case it normalizes it to standard in the winter, positive DST in the summer.

Now, Jiff doesn't have any control over whether the system tzdb uses rearguard or not, and I don't know if this is even observable in the tzifs (other than looking for the specific Ireland issue). The issue this introduces is that the `Dst` flag for Ireland will differ between systems. My system tzdb (Mac) uses rearguard, however `jiff-tzdb` does not use rearguard, so there's a behaviour difference even if both are on the same tzdb version.

ICU4X requires the `ZoneVariant` to use the rearguard semantics, i.e. DSTs are positive. It would be nice if jiff could correct for that.
I think this should be correctable during parsing. In https://github.com/BurntSushi/jiff/blob/e094b01adfc0faaeb78f2cf0b4888b028c686bee/src/tz/tzif.rs#L609C8-L609C30, if any DST offset is negative, all DST flags in that tzif file need to be inverted.

OK, so I wanted to try and demonstrate the problem in terms of Jiff behavior. Here's a Rust program, with the `tzdb-bundle-always` feature enabled:

```rust
use jiff::{tz::TimeZoneDatabase, Timestamp};

fn main() -> anyhow::Result<()> {
    let winter: Timestamp = "2024-01-05T00Z".parse()?;
    let summer: Timestamp = "2024-07-05T00Z".parse()?;

    let tzdb = TimeZoneDatabase::from_dir("/usr/share/zoneinfo")?;
    let tz = tzdb.get("Europe/Dublin")?;
    let info = tz.to_offset_info(winter);
    println!("winter time from zoneinfo: {info:?}");
    let info = tz.to_offset_info(summer);
    println!("summer time from zoneinfo: {info:?}");

    let tzdb = TimeZoneDatabase::bundled();
    let tz = tzdb.get("Europe/Dublin")?;
    let info = tz.to_offset_info(winter);
    println!(" winter time from bundled: {info:?}");
    let info = tz.to_offset_info(summer);
    println!(" summer time from bundled: {info:?}");

    Ok(())
}
```

And its output on my Linux system:

```
winter time from zoneinfo: TimeZoneOffsetInfo { offset: 00:00:00, dst: Yes, abbreviation: Borrowed("GMT") }
summer time from zoneinfo: TimeZoneOffsetInfo { offset: 01:00:00, dst: No, abbreviation: Borrowed("IST") }
 winter time from bundled: TimeZoneOffsetInfo { offset: 00:00:00, dst: Yes, abbreviation: Borrowed("GMT") }
 summer time from bundled: TimeZoneOffsetInfo { offset: 01:00:00, dst: No, abbreviation: Borrowed("IST") }
```

And its output on my M2 mac mini:

```
winter time from zoneinfo: TimeZoneOffsetInfo { offset: 00:00:00, dst: No, abbreviation: Borrowed("GMT") }
summer time from zoneinfo: TimeZoneOffsetInfo { offset: 01:00:00, dst: Yes, abbreviation: Borrowed("IST") }
 winter time from bundled: TimeZoneOffsetInfo { offset: 00:00:00, dst: Yes, abbreviation: Borrowed("GMT") }
 summer time from bundled: TimeZoneOffsetInfo { offset: 01:00:00, dst: No, abbreviation: Borrowed("IST") }
```

That is quite interesting! I wonder if the POSIX TZ string in each differs? Because I get the same result for both environments even if I use a date far in the future. So on my Linux system, I get (from the root of this repo):

```
$ ./scripts/jiff-debug tzif /usr/share/zoneinfo/Europe/Dublin | rg -A1 'POSIX TIME ZONE'
POSIX TIME ZONE STRING
  IST-1GMT0,M10.5.0,M3.5.0/1
```

But on my mac, I get:

```
$ ./scripts/jiff-debug tzif /usr/share/zoneinfo/Europe/Dublin | rg -A1 'POSIX TIME ZONE'
POSIX TIME ZONE STRING
  GMT0IST,M3.5.0/1,M10.5.0
```

That's wild. I'll look into your suggestion.
Re-reading your comments, I noticed that you say that ICU4X expects the mac behavior above? But to me it looks like the Linux behavior is correct. Because Ireland has DST in the winter. And looking back in `NEWS` of tzdb, it looks like rearguard was only introduced because some consumers couldn't handle negative DST offsets?

```
  Changes to build procedure

    The new DATAFORM macro in the Makefile lets the installer choose
    among three source data formats.  The idea is to lessen downstream
    disruption when data formats are improved.

    * DATAFORM=vanguard installs from the latest, bleeding-edge
      format.  DATAFORM=main (the default) installs from the format
      used in the 'africa' etc. files.  DATAFORM=rearguard installs
      from a trailing-edge format.  Eventually, elements of today's
      vanguard format should move to the main format, and similarly
      the main format's features should eventually move to the
      rearguard format.

    * In the current version, the main and rearguard formats are
      identical and match that of 2018c, so this change does not
      affect default behavior.  The vanguard format currently contains
      one feature not in the main format: negative SAVE values.  This
      improves support for Ireland, which uses Irish Standard Time
      (IST, UTC+01) in summer and GMT (UTC) in winter.  tzcode has
      supported negative SAVE values for decades, and this feature
      should move to the main format soon.  However, it will not move
      to the rearguard format for quite some time because some
      downstream parsers do not support it.

    * The build procedure constructs three files vanguard.zi, main.zi,
      and rearguard.zi, one for each format.  Although the files
      represent essentially the same data, they may have minor
      discrepancies that users are not likely to notice.  The files
      are intended for downstream data consumers and are not
      installed.  Zoneinfo parsers that do not support negative SAVE values
      should start using rearguard.zi, so that they will be unaffected
      when the negative-DST feature moves from vanguard to main.
      Bleeding-edge Zoneinfo parsers that support the new features
      already can use vanguard.zi; in this respect, current tzcode is
      bleeding-edge.
```

I get wanting to normalize behavior here, but why normalize to rearguard behavior? Is there a place where I can read more about ICU4X's decision here?
Ireland does not have DST in the winter, even if the TZDB says so. Wikipedia:

> Daylight saving time (DST), also referred to as [...] summer time, is the practice of advancing clocks to make better use of the longer daylight available during summer.

Basically, with the 2018a update, which introduced this, TZDB changed the meaning of the "dst" flag to a "rule applies" flag, which is completely useless (the "dst" flag was _almost_ useless, except for this one localization use case). The TZDB maintainer's only motivation for this seems to have been that Ireland calls their summer time "Irish Standard Time", however that doesn't make it not a DST. There was some [discussion](https://lists.iana.org/hyperkitty/list/tz@iana.org/message/B7W7USZZQROBQI6NRQKUFWZH3EZIU4AN/) back then, because it broke ICU (which needs the "dst" flag to mean "dst"), but the only thing that came of that is that the maintainer used the rearguard mechanism, which is why there are now two versions of `Europe/Dublin` on different systems.

Apple seems to have decided that this change doesn't make sense, and uses the rearguard version. ICU and ICU4X also need the flag to mean "dst", so they require the rearguard version.
Sigh. OK. Given that the primary (only?) purpose of the DST flag exposed by Jiff is for formatting/localization, and given Unicode's stance here, I think it's prudent to follow in their footsteps. And I like your idea of trying to fix this up in the TZif parser.
I've just investigated this a bit more and that fix won't work because it would also affect two time zones that don't differ across vanguard/rearguard. `Africa/Casablanca` and `Africa/El_Aaiun` have negative "DST" during Ramadan. This is not rearguarded because it makes sense, it's their yearly period with a non-standard offset and a non-standard display name.

So I think this will need to be a special-casing of `Europe/Dublin`.
These are the ICU4X docs I'm working on. I've identified four zones that differ, and the date ranges for which the flag needs to be checked and potentially flipped.

<img width="1103" alt="Image" src="https://github.com/user-attachments/assets/3227e3f1-d4af-4588-90c7-c49400740b31" />

*`Africa/Windhoek`

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9ea5a11..3d83d4c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,15 @@
 ===========
 TODO
 
+Enhancements:
+
+* [#256](https://github.com/BurntSushi/jiff/issues/256):
+Add `tz::{get,include}` macros for time zone support in core-only environments.
+* [#258](https://github.com/BurntSushi/jiff/issues/258):
+Switch to `rearguard` tzdb data in `jiff-tzdb` and document it.
+* [#259](https://github.com/BurntSushi/jiff/pull/259):
+De-duplicate TZif data in `jiff-tzdb`.
+
 Bug fixes:
 
 * [#261](https://github.com/BurntSushi/jiff/issues/261):
diff --git a/Cargo.toml b/Cargo.toml
index 59635f0..8bd070e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -136,7 +136,7 @@ tzdb-concatenated = ["std"]
 js = ["dep:wasm-bindgen", "dep:js-sys"]
 
 [dependencies]
-jiff-static = { version = "=0.2.1", path = "crates/jiff-static", optional = true }
+jiff-static = { version = "0.2", path = "crates/jiff-static", optional = true }
 jiff-tzdb = { version = "0.1.2", path = "crates/jiff-tzdb", optional = true }
 log = { version = "0.4.21", optional = true, default-features = false }
 serde = { version = "1.0.203", optional = true, default-features = false }
diff --git a/crates/jiff-cli/cmd/generate/zoneinfo.rs b/crates/jiff-cli/cmd/generate/zoneinfo.rs
index 29465a5..55f5f98 100644
--- a/crates/jiff-cli/cmd/generate/zoneinfo.rs
+++ b/crates/jiff-cli/cmd/generate/zoneinfo.rs
@@ -11,6 +11,7 @@ And at that point, we wouldn't need `zic` any more.
 */
 
 use std::{
+    fs::File,
     path::{Path, PathBuf},
     process::Command,
 };
@@ -121,6 +122,43 @@ pub fn run(p: &mut Parser) -> anyhow::Result<()> {
         )
     })?;
 
+    // Generate "rearguard" data. tzdb has this to say about it:
+    //
+    // > The build procedure constructs three files vanguard.zi, main.zi,
+    // > and rearguard.zi, one for each format. Although the files represent
+    // > essentially the same data, they may have minor discrepancies that
+    // > users are not likely to notice. The files are intended for downstream
+    // > data consumers and are not installed. Zoneinfo parsers that do not
+    // > support negative SAVE values should start using rearguard.zi, so that
+    // > they will be unaffected when the negative-DST feature moves from
+    // > vanguard to main. Bleeding-edge Zoneinfo parsers that support the new
+    // > features already can use vanguard.zi; in this respect, current tzcode
+    // > is bleeding-edge.
+    //
+    // In effect, rearguard data doesn't use negative DST offsets, which are
+    // somewhat odd given that the concept of "daylight saving time" involves
+    // moving the clocks forward _to add more daylight_ to the typical waking
+    // hours of the day. So we specifically stick to rearguard data so that
+    // DST is more accurately modeled. The IANA release distribution provides
+    // this via an `awk` script that transforms the standard "main" zi data.
+    let mut cmd = Command::new("awk");
+    cmd.args(["-v", "DATAFORM=rearguard", "-f"])
+        .arg(tzdata.join("ziguard.awk"));
+    for tzdata_file in TZDATA_FILES {
+        cmd.arg(tzdata.join(tzdata_file));
+    }
+    let rearguard_path = outdir.join("rearguard.zi");
+    let rearguard = File::create(&rearguard_path).with_context(|| {
+        format!("failed to create `{}`", rearguard_path.display())
+    })?;
+    cmd.stdout(rearguard);
+    let status =
+        cmd.status().with_context(|| format!("failed to run `{cmd:?}`"))?;
+    anyhow::ensure!(
+        status.success(),
+        "running `{cmd:?}` failed with status {status}"
+    );
+
     // Run the zic compiler.
     let mut cmd = Command::new(zic);
     if config.verbose {
@@ -132,9 +170,7 @@ pub fn run(p: &mut Parser) -> anyhow::Result<()> {
     // redundant with the POSIX TZ strings for that time zone.
     cmd.arg("-b").arg("slim");
     cmd.arg("-d").arg(outdir);
-    for tzdata_file in TZDATA_FILES {
-        cmd.arg(tzdata.join(tzdata_file));
-    }
+    cmd.arg(&rearguard_path);
     let status =
         cmd.status().with_context(|| format!("failed to run `{cmd:?}`"))?;
     anyhow::ensure!(
diff --git a/crates/jiff-tzdb/concatenated-zoneinfo.dat b/crates/jiff-tzdb/concatenated-zoneinfo.dat
index 7af0d16..8fd4a08 100644
Binary files a/crates/jiff-tzdb/concatenated-zoneinfo.dat and b/crates/jiff-tzdb/concatenated-zoneinfo.dat differ
diff --git a/crates/jiff-tzdb/lib.rs b/crates/jiff-tzdb/lib.rs
index acf962e..8d167e7 100644
--- a/crates/jiff-tzdb/lib.rs
+++ b/crates/jiff-tzdb/lib.rs
@@ -30,9 +30,56 @@ on this crate and bundle the time zone data into the binary. This is not an
 ideal solution, but it makes Most Things Just Work Most of the Time on all
 major platforms.
 
+# Data generation
+
+The data in this crate comes from the [IANA Time Zone Database] "data only"
+distribution. [`jiff-cli`] is used to first compile the release into binary
+TZif data using the `zic` compiler, and secondly, converts the binary data into
+a flattened and de-duplicated representation that is embedded into this crate's
+source code.
+
+The conversion into the TZif binary data uses the following settings:
+
+* The "rearguard" data is used (see below).
+* The binary data itself is compiled using the "slim" format. Which
+  effectively means that the TZif data primarily only uses explicit
+  time zone transitions for historical data and POSIX time zones for
+  current time zone transition rules. This doesn't have any impact
+  on the actual results. The reason that there are "slim" and "fat"
+  formats is to support legacy applications that can't deal with
+  POSIX time zones. For example, `/usr/share/zoneinfo` on my modern
+  Archlinux installation (2025-02-27) is in the "fat" format.
+
+The reason that rearguard data is used is a bit more subtle and has to do with
+a difference in how the IANA Time Zone Database treats its internal "daylight
+saving time" flag and what people in the "real world" consider "daylight
+saving time." For example, in the standard distribution of the IANA Time Zone
+Database, `Europe/Dublin` has its daylight saving time flag set to _true_
+during Winter and set to _false_ during Summer. The actual time shifts are the
+same as, e.g., `Europe/London`, but which one is actually labeled "daylight
+saving time" is not.
+
+The IANA Time Zone Database does this for `Europe/Dublin`, presumably, because
+_legally_, time during the Summer in Ireland is called `Irish Standard Time`,
+and time during the Winter is called `Greenwich Mean Time`. These legal names
+are reversed from what is typically the case, where "standard" time is during
+the Winter and daylight saving time is during the Summer. The IANA Time Zone
+Database implements this tweak in legal language via a "negative daylight
+saving time offset." This is somewhat odd, and some consumers of the IANA Time
+Zone Database cannot handle it. Thus, the rearguard format was born for,
+seemingly, legacy programs.
+
+Jiff can handle negative daylight saving time offsets just fine, but we use the
+rearguard format anyway so that the underlying data more accurately reflects
+on-the-ground reality for humans living in `Europe/Dublin`. In particular,
+using the rearguard data enables [localization of time zone names] to be done
+correctly.
+
 [IANA Time Zone Database]: https://www.iana.org/time-zones
 [TZif]: https://datatracker.ietf.org/doc/html/rfc8536
 [Jiff]: https://docs.rs/jiff
+[`jiff-cli`]: https://github.com/BurntSushi/jiff/tree/master/crates/jiff-cli
+[localization of time zone names]: https://github.com/BurntSushi/jiff/issues/258
 */
 
 #![no_std]
diff --git a/crates/jiff-tzdb/tzname.rs b/crates/jiff-tzdb/tzname.rs
index d4e40ad..468ce17 100644
--- a/crates/jiff-tzdb/tzname.rs
+++ b/crates/jiff-tzdb/tzname.rs
@@ -14,15 +14,15 @@ pub(super) static TZNAME_TO_OFFSET: &[(&str, core::ops::Range<usize>)] = &[
     (r"Africa/Blantyre", 3851..3982),
     (r"Africa/Brazzaville", 10414..10594),
     (r"Africa/Bujumbura", 3851..3982),
-    (r"Africa/Cairo", 163446..164755),
-    (r"Africa/Casablanca", 188532..190451),
+    (r"Africa/Cairo", 163461..164770),
+    (r"Africa/Casablanca", 188535..190456),
     (r"Africa/Ceuta", 41827..42389),
     (r"Africa/Conakry", 3982..4112),
     (r"Africa/Dakar", 3982..4112),
     (r"Africa/Dar_es_Salaam", 12063..12254),
     (r"Africa/Djibouti", 12063..12254),
     (r"Africa/Douala", 10414..10594),
-    (r"Africa/El_Aaiun", 184824..186654),
+    (r"Africa/El_Aaiun", 184831..186657),
     (r"Africa/Freetown", 3982..4112),
     (r"Africa/Gaborone", 3851..3982),
     (r"Africa/Harare", 3851..3982),
@@ -54,102 +54,102 @@ pub(super) static TZNAME_TO_OFFSET: &[(&str, core::ops::Range<usize>)] = &[
     (r"Africa/Timbuktu", 3982..4112),
     (r"Africa/Tripoli", 29570..30001),
     (r"Africa/Tunis", 31769..32218),
-    (r"Africa/Windhoek", 54642..55280),
-    (r"America/Adak", 122672..123641),
-    (r"America/Anchorage", 124616..125593),
+    (r"Africa/Windhoek", 56604..57257),
+    (r"America/Adak", 122687..123656),
+    (r"America/Anchorage", 124631..125608),
     (r"America/Anguilla", 9872..10049),
     (r"America/Antigua", 9872..10049),
     (r"America/Araguaina", 48346..48938),
-    (r"America/Argentina/Buenos_Aires", 69717..70425),
-    (r"America/Argentina/Catamarca", 71133..71841),
-    (r"America/Argentina/ComodRivadavia", 71133..71841),
-    (r"America/Argentina/Cordoba", 70425..71133),
-    (r"America/Argentina/Jujuy", 61955..62645),
-    (r"America/Argentina/La_Rioja", 76099..76816),
-    (r"America/Argentina/Mendoza", 72549..73257),
-    (r"America/Argentina/Rio_Gallegos", 73257..73965),
-    (r"America/Argentina/Salta", 62645..63335),
-    (r"America/Argentina/San_Juan", 76816..77533),
-    (r"America/Argentina/San_Luis", 75382..76099),
-    (r"America/Argentina/Tucuman", 77533..78259),
-    (r"America/Argentina/Ushuaia", 71841..72549),
+    (r"America/Argentina/Buenos_Aires", 69732..70440),
+    (r"America/Argentina/Catamarca", 71148..71856),
+    (r"America/Argentina/ComodRivadavia", 71148..71856),
+    (r"America/Argentina/Cordoba", 70440..71148),
+    (r"America/Argentina/Jujuy", 61970..62660),
+    (r"America/Argentina/La_Rioja", 76114..76831),
+    (r"America/Argentina/Mendoza", 72564..73272),
+    (r"America/Argentina/Rio_Gallegos", 73272..73980),
+    (r"America/Argentina/Salta", 62660..63350),
+    (r"America/Argentina/San_Juan", 76831..77548),
+    (r"America/Argentina/San_Luis", 75397..76114),
+    (r"America/Argentina/Tucuman", 77548..78274),
+    (r"America/Argentina/Ushuaia", 71856..72564),
     (r"America/Aruba", 9872..10049),
-    (r"America/Asuncion", 152542..153627),
+    (r"America/Asuncion", 152557..153642),
     (r"America/Atikokan", 5647..5796),
-    (r"America/Atka", 122672..123641),
-    (r"America/Bahia", 65486..66168),
-    (r"America/Bahia_Banderas", 68294..68994),
+    (r"America/Atka", 122687..123656),
+    (r"America/Bahia", 65501..66183),
+    (r"America/Bahia_Banderas", 68309..69009),
     (r"America/Barbados", 18004..18282),
     (r"America/Belem", 25854..26248),
-    (r"America/Belize", 148210..149255),
+    (r"America/Belize", 148225..149270),
     (r"America/Blanc-Sablon", 9872..10049),
     (r"America/Boa_Vista", 30001..30431),
     (r"America/Bogota", 9514..9693),
-    (r"America/Boise", 136102..137101),
-    (r"America/Buenos_Aires", 69717..70425),
-    (r"America/Cambridge_Bay", 108977..109860),
-    (r"America/Campo_Grande", 138053..139005),
+    (r"America/Boise", 136117..137116),
+    (r"America/Buenos_Aires", 69732..70440),
+    (r"America/Cambridge_Bay", 108992..109875),
+    (r"America/Campo_Grande", 138068..139020),
     (r"America/Cancun", 41289..41827),
     (r"America/Caracas", 11873..12063),
-    (r"America/Catamarca", 71133..71841),
+    (r"America/Catamarca", 71148..71856),
     (r"America/Cayenne", 6101..6252),
     (r"America/Cayman", 5647..5796),
-    (r"America/Chicago", 183070..184824),
-    (r"America/Chihuahua", 64040..64731),
-    (r"America/Ciudad_Juarez", 66858..67576),
+    (r"America/Chicago", 183077..184831),
+    (r"America/Chihuahua", 64055..64746),
+    (r"America/Ciudad_Juarez", 66873..67591),
     (r"America/Coral_Harbour", 5647..5796),
-    (r"America/Cordoba", 70425..71133),
+    (r"America/Cordoba", 70440..71148),
     (r"America/Costa_Rica", 16497..16729),
     (r"America/Creston", 16966..17206),
-    (r"America/Cuiaba", 132218..133152),
+    (r"America/Cuiaba", 132233..133167),
     (r"America/Curacao", 9872..10049),
     (r"America/Danmarkshavn", 31322..31769),
-    (r"America/Dawson", 142026..143055),
-    (r"America/Dawson_Creek", 61272..61955),
-    (r"America/Denver", 147168..148210),
-    (r"America/Detroit", 112545..113444),
+    (r"America/Dawson", 142041..143070),
+    (r"America/Dawson_Creek", 61287..61970),
+    (r"America/Denver", 147183..148225),
+    (r"America/Detroit", 112560..113459),
     (r"America/Dominica", 9872..10049),
-    (r"America/Edmonton", 133152..134122),
+    (r"America/Edmonton", 133167..134137),
     (r"America/Eirunepe", 30431..30867),
     (r"America/El_Salvador", 11514..11690),
-    (r"America/Ensenada", 149255..150334),
-    (r"America/Fort_Nelson", 170321..171769),
+    (r"America/Ensenada", 149270..150349),
+    (r"America/Fort_Nelson", 170336..171784),
     (r"America/Fort_Wayne", 36060..36591),
     (r"America/Fortaleza", 37559..38043),
-    (r"America/Glace_Bay", 110768..111648),
-    (r"America/Godthab", 190451..191416),
-    (r"America/Goose_Bay", 174758..176338),
-    (r"America/Grand_Turk", 108124..108977),
+    (r"America/Glace_Bay", 110783..111663),
+    (r"America/Godthab", 190456..191421),
+    (r"America/Goose_Bay", 174765..176345),
+    (r"America/Grand_Turk", 108139..108992),
     (r"America/Grenada", 9872..10049),
     (r"America/Guadeloupe", 9872..10049),
     (r"America/Guatemala", 15573..15785),
     (r"America/Guayaquil", 9693..9872),
     (r"America/Guyana", 10594..10775),
-    (r"America/Halifax", 177937..179609),
-    (r"America/Havana", 153627..154744),
+    (r"America/Halifax", 177944..179616),
+    (r"America/Havana", 153642..154759),
     (r"America/Hermosillo", 17472..17730),
     (r"America/Indiana/Indianapolis", 36060..36591),
-    (r"America/Indiana/Knox", 139981..140997),
+    (r"America/Indiana/Knox", 139996..141012),
     (r"America/Indiana/Marengo", 40172..40739),
-    (r"America/Indiana/Petersburg", 59935..60618),
+    (r"America/Indiana/Petersburg", 59950..60633),
     (r"America/Indiana/Tell_City", 35538..36060),
     (r"America/Indiana/Vevay", 20693..21062),
     (r"America/Indiana/Vincennes", 39614..40172),
     (r"America/Indiana/Winamac", 44132..44735),
     (r"America/Indianapolis", 36060..36591),
-    (r"America/Inuvik", 105587..106404),
-    (r"America/Iqaluit", 106404..107259),
+    (r"America/Inuvik", 105602..106419),
+    (r"America/Iqaluit", 106419..107274),
     (r"America/Jamaica", 21737..22076),
-    (r"America/Jujuy", 61955..62645),
-    (r"America/Juneau", 120785..121751),
-    (r"America/Kentucky/Louisville", 158382..159624),
-    (r"America/Kentucky/Monticello", 131246..132218),
-    (r"America/Knox_IN", 139981..140997),
+    (r"America/Jujuy", 61970..62660),
+    (r"America/Juneau", 120800..121766),
+    (r"America/Kentucky/Louisville", 158397..159639),
+    (r"America/Kentucky/Monticello", 131261..132233),
+    (r"America/Knox_IN", 139996..141012),
     (r"America/Kralendijk", 9872..10049),
     (r"America/La_Paz", 7964..8134),
     (r"America/Lima", 18282..18565),
-    (r"America/Los_Angeles", 160858..162152),
-    (r"America/Louisville", 158382..159624),
+    (r"America/Los_Angeles", 160873..162167),
+    (r"America/Louisville", 158397..159639),
     (r"America/Lower_Princes", 9872..10049),
     (r"America/Maceio", 38601..39103),
     (r"America/Managua", 18565..18860),
@@ -157,30 +157,30 @@ pub(super) static TZNAME_TO_OFFSET: &[(&str, core::ops::Range<usize>)] = &[
     (r"America/Marigot", 9872..10049),
     (r"America/Martinique", 10049..10227),
     (r"America/Matamoros", 28692..29129),
-    (r"America/Mazatlan", 66168..66858),
-    (r"America/Mendoza", 72549..73257),
-    (r"America/Menominee", 115235..116152),
-    (r"America/Merida", 60618..61272),
+    (r"America/Mazatlan", 66183..66873),
+    (r"America/Mendoza", 72564..73272),
+    (r"America/Menominee", 115250..116167),
+    (r"America/Merida", 60633..61287),
     (r"America/Metlakatla", 42389..42975),
-    (r"America/Mexico_City", 98417..99190),
+    (r"America/Mexico_City", 98432..99205),
     (r"America/Miquelon", 40739..41289),
-    (r"America/Moncton", 173265..174758),
-    (r"America/Monterrey", 74673..75382),
-    (r"America/Montevideo", 128402..129371),
-    (r"America/Montreal", 179609..181326),
+    (r"America/Moncton", 173272..174765),
+    (r"America/Monterrey", 74688..75397),
+    (r"America/Montevideo", 128417..129386),
+    (r"America/Montreal", 179616..181333),
     (r"America/Montserrat", 9872..10049),
-    (r"America/Nassau", 179609..181326),
-    (r"America/New_York", 181326..183070),
-    (r"America/Nipigon", 179609..181326),
-    (r"America/Nome", 123641..124616),
+    (r"America/Nassau", 179616..181333),
+    (r"America/New_York", 181333..183077),
+    (r"America/Nipigon", 179616..181333),
+    (r"America/Nome", 123656..124631),
     (r"America/Noronha", 36591..37075),
-    (r"America/North_Dakota/Beulah", 146125..147168),
-    (r"America/North_Dakota/Center", 134122..135112),
-    (r"America/North_Dakota/New_Salem", 135112..136102),
-    (r"America/Nuuk", 190451..191416),
-    (r"America/Ojinaga", 67576..68294),
+    (r"America/North_Dakota/Beulah", 146140..147183),
+    (r"America/North_Dakota/Center", 134137..135127),
+    (r"America/North_Dakota/New_Salem", 135127..136117),
+    (r"America/Nuuk", 190456..191421),
+    (r"America/Ojinaga", 67591..68309),
     (r"America/Panama", 5647..5796),
-    (r"America/Pangnirtung", 106404..107259),
+    (r"America/Pangnirtung", 106419..107274),
     (r"America/Paramaribo", 10958..11145),
     (r"America/Phoenix", 16966..17206),
     (r"America/Port-au-Prince", 42975..43540),
@@ -188,24 +188,24 @@ pub(super) static TZNAME_TO_OFFSET: &[(&str, core::ops::Range<usize>)] = &[
     (r"America/Porto_Acre", 28274..28692),
     (r"America/Porto_Velho", 26248..26642),
     (r"America/Puerto_Rico", 9872..10049),
-    (r"America/Punta_Arenas", 157164..158382),
-    (r"America/Rainy_River", 162152..163446),
-    (r"America/Rankin_Inlet", 104780..105587),
+    (r"America/Punta_Arenas", 157179..158397),
+    (r"America/Rainy_River", 162167..163461),
+    (r"America/Rankin_Inlet", 104795..105602),
     (r"America/Recife", 37075..37559),
-    (r"America/Regina", 55280..55918),
-    (r"America/Resolute", 103973..104780),
+    (r"America/Regina", 54642..55280),
+    (r"America/Resolute", 103988..104795),
     (r"America/Rio_Branco", 28274..28692),
-    (r"America/Rosario", 70425..71133),
-    (r"America/Santa_Isabel", 149255..150334),
+    (r"America/Rosario", 70440..71148),
+    (r"America/Santa_Isabel", 149270..150349),
     (r"America/Santarem", 27453..27862),
-    (r"America/Santiago", 194648..196002),
+    (r"America/Santiago", 194653..196007),
     (r"America/Santo_Domingo", 19436..19753),
-    (r"America/Sao_Paulo", 137101..138053),
-    (r"America/Scoresbysund", 191416..192400),
-    (r"America/Shiprock", 147168..148210),
-    (r"America/Sitka", 119829..120785),
+    (r"America/Sao_Paulo", 137116..138068),
+    (r"America/Scoresbysund", 191421..192405),
+    (r"America/Shiprock", 147183..148225),
+    (r"America/Sitka", 119844..120800),
     (r"America/St_Barthelemy", 9872..10049),
-    (r"America/St_Johns", 186654..188532),
+    (r"America/St_Johns", 186657..188535),
     (r"America/St_Kitts", 9872..10049),
     (r"America/St_Lucia", 9872..10049),
     (r"America/St_Thomas", 9872..10049),
@@ -213,92 +213,92 @@ pub(super) static TZNAME_TO_OFFSET: &[(&str, core::ops::Range<usize>)] = &[
     (r"America/Swift_Current", 22418..22786),
     (r"America/Tegucigalpa", 13299..13493),
     (r"America/Thule", 30867..31322),
-    (r"America/Thunder_Bay", 179609..181326),
-    (r"America/Tijuana", 149255..150334),
-    (r"America/Toronto", 179609..181326),
+    (r"America/Thunder_Bay", 179616..181333),
+    (r"America/Tijuana", 149270..150349),
+    (r"America/Toronto", 179616..181333),
     (r"America/Tortola", 9872..10049),
-    (r"America/Vancouver", 164755..166085),
+    (r"America/Vancouver", 164770..166100),
     (r"America/Virgin", 9872..10049),
-    (r"America/Whitehorse", 140997..142026),
-    (r"America/Winnipeg", 162152..163446),
-    (r"America/Yakutat", 118883..119829),
-    (r"America/Yellowknife", 133152..134122),
+    (r"America/Whitehorse", 141012..142041),
+    (r"America/Winnipeg", 162167..163461),
+    (r"America/Yakutat", 118898..119844),
+    (r"America/Yellowknife", 133167..134137),
     (r"Antarctica/Casey", 18860..19147),
     (r"Antarctica/Davis", 13493..13690),
     (r"Antarctica/DumontDUrville", 6705..6859),
-    (r"Antarctica/Macquarie", 139005..139981),
+    (r"Antarctica/Macquarie", 139020..139996),
     (r"Antarctica/Mawson", 6553..6705),
-    (r"Antarctica/McMurdo", 145082..146125),
-    (r"Antarctica/Palmer", 114348..115235),
+    (r"Antarctica/McMurdo", 145097..146140),
+    (r"Antarctica/Palmer", 114363..115250),
     (r"Antarctica/Rothera", 3295..3427),
-    (r"Antarctica/South_Pole", 145082..146125),
+    (r"Antarctica/South_Pole", 145097..146140),
     (r"Antarctica/Syowa", 4777..4910),
     (r"Antarctica/Troll", 3427..3585),
     (r"Antarctica/Vostok", 8821..8991),
-    (r"Arctic/Longyearbyen", 63335..64040),
+    (r"Arctic/Longyearbyen", 63350..64055),
     (r"Asia/Aden", 4777..4910),
     (r"Asia/Almaty", 50854..51472),
-    (r"Asia/Amman", 130318..131246),
-    (r"Asia/Anadyr", 83363..84106),
+    (r"Asia/Amman", 130333..131261),
+    (r"Asia/Anadyr", 83378..84121),
     (r"Asia/Aqtau", 47124..47730),
     (r"Asia/Aqtobe", 48938..49553),
     (r"Asia/Ashgabat", 24273..24648),
     (r"Asia/Ashkhabad", 24273..24648),
     (r"Asia/Atyrau", 47730..48346),
-    (r"Asia/Baghdad", 56612..57242),
+    (r"Asia/Baghdad", 55974..56604),
     (r"Asia/Bahrain", 6401..6553),
-    (r"Asia/Baku", 88566..89310),
+    (r"Asia/Baku", 88581..89325),
     (r"Asia/Bangkok", 5343..5495),
-    (r"Asia/Barnaul", 94617..95370),
-    (r"Asia/Beirut", 78994..79726),
+    (r"Asia/Barnaul", 94632..95385),
+    (r"Asia/Beirut", 79009..79741),
     (r"Asia/Bishkek", 51472..52090),
     (r"Asia/Brunei", 19753..20073),
     (r"Asia/Calcutta", 13690..13910),
-    (r"Asia/Chita", 89310..90060),
+    (r"Asia/Chita", 89325..90075),
     (r"Asia/Choibalsan", 45936..46530),
     (r"Asia/Chongqing", 25461..25854),
     (r"Asia/Chungking", 25461..25854),
     (r"Asia/Colombo", 14362..14609),
     (r"Asia/Dacca", 14131..14362),
-    (r"Asia/Damascus", 159624..160858),
+    (r"Asia/Damascus", 159639..160873),
     (r"Asia/Dhaka", 14131..14362),
     (r"Asia/Dili", 8651..8821),
     (r"Asia/Dubai", 4511..4644),
     (r"Asia/Dushanbe", 23152..23518),
-    (r"Asia/Famagusta", 127462..128402),
-    (r"Asia/Gaza", 196002..198952),
+    (r"Asia/Famagusta", 127477..128417),
+    (r"Asia/Gaza", 196007..198957),
     (r"Asia/Harbin", 25461..25854),
-    (r"Asia/Hebron", 198952..201920),
+    (r"Asia/Hebron", 198957..201925),
     (r"Asia/Ho_Chi_Minh", 15785..16021),
-    (r"Asia/Hong_Kong", 100806..101581),
+    (r"Asia/Hong_Kong", 100821..101596),
     (r"Asia/Hovd", 46530..47124),
-    (r"Asia/Irkutsk", 91566..92326),
-    (r"Asia/Istanbul", 154744..155944),
+    (r"Asia/Irkutsk", 91581..92341),
+    (r"Asia/Istanbul", 154759..155959),
     (r"Asia/Jakarta", 14856..15104),
     (r"Asia/Jayapura", 8480..8651),
-    (r"Asia/Jerusalem", 192400..193474),
+    (r"Asia/Jerusalem", 192405..193479),
     (r"Asia/Kabul", 6859..7018),
-    (r"Asia/Kamchatka", 80452..81179),
+    (r"Asia/Kamchatka", 80467..81194),
     (r"Asia/Karachi", 17206..17472),
     (r"Asia/Kashgar", 4644..4777),
     (r"Asia/Kathmandu", 7479..7640),
     (r"Asia/Katmandu", 7479..7640),
-    (r"Asia/Khandyga", 96876..97651),
+    (r"Asia/Khandyga", 96891..97666),
     (r"Asia/Kolkata", 13690..13910),
-    (r"Asia/Krasnoyarsk", 85588..86329),
+    (r"Asia/Krasnoyarsk", 85603..86344),
     (r"Asia/Kuala_Lumpur", 15104..15360),
     (r"Asia/Kuching", 19753..20073),
     (r"Asia/Kuwait", 4777..4910),
-    (r"Asia/Macao", 102370..103161),
-    (r"Asia/Macau", 102370..103161),
-    (r"Asia/Magadan", 90060..90811),
+    (r"Asia/Macao", 102385..103176),
+    (r"Asia/Macau", 102385..103176),
+    (r"Asia/Magadan", 90075..90826),
     (r"Asia/Makassar", 11145..11335),
     (r"Asia/Manila", 17730..18004),
     (r"Asia/Muscat", 4511..4644),
     (r"Asia/Nicosia", 44735..45332),
-    (r"Asia/Novokuznetsk", 81179..81905),
-    (r"Asia/Novosibirsk", 95370..96123),
-    (r"Asia/Omsk", 84106..84847),
+    (r"Asia/Novokuznetsk", 81194..81920),
+    (r"Asia/Novosibirsk", 95385..96138),
+    (r"Asia/Omsk", 84121..84862),
     (r"Asia/Oral", 49553..50178),
     (r"Asia/Phnom_Penh", 5343..5495),
     (r"Asia/Pontianak", 14609..14856),
@@ -309,89 +309,89 @@ pub(super) static TZNAME_TO_OFFSET: &[(&str, core::ops::Range<usize>)] = &[
     (r"Asia/Rangoon", 10227..10414),
     (r"Asia/Riyadh", 4777..4910),
     (r"Asia/Saigon", 15785..16021),
-    (r"Asia/Sakhalin", 90811..91566),
+    (r"Asia/Sakhalin", 90826..91581),
     (r"Asia/Samarkand", 23518..23884),
     (r"Asia/Seoul", 27038..27453),
     (r"Asia/Shanghai", 25461..25854),
     (r"Asia/Singapore", 15104..15360),
-    (r"Asia/Srednekolymsk", 87071..87813),
+    (r"Asia/Srednekolymsk", 87086..87828),
     (r"Asia/Taipei", 39103..39614),
     (r"Asia/Tashkent", 22786..23152),
     (r"Asia/Tbilisi", 53338..53967),
-    (r"Asia/Tehran", 103161..103973),
-    (r"Asia/Tel_Aviv", 192400..193474),
+    (r"Asia/Tehran", 103176..103988),
+    (r"Asia/Tel_Aviv", 192405..193479),
     (r"Asia/Thimbu", 7171..7325),
     (r"Asia/Thimphu", 7171..7325),
     (r"Asia/Tokyo", 15360..15573),
-    (r"Asia/Tomsk", 96123..96876),
+    (r"Asia/Tomsk", 96138..96891),
     (r"Asia/Ujung_Pandang", 11145..11335),
     (r"Asia/Ulaanbaatar", 45936..46530),
     (r"Asia/Ulan_Bator", 45936..46530),
     (r"Asia/Urumqi", 4644..4777),
-    (r"Asia/Ust-Nera", 93846..94617),
+    (r"Asia/Ust-Nera", 93861..94632),
     (r"Asia/Vientiane", 5343..5495),
-    (r"Asia/Vladivostok", 86329..87071),
-    (r"Asia/Yakutsk", 84847..85588),
+    (r"Asia/Vladivostok", 86344..87086),
+    (r"Asia/Yakutsk", 84862..85603),
     (r"Asia/Yangon", 10227..10414),
-    (r"Asia/Yekaterinburg", 92326..93086),
-    (r"Asia/Yerevan", 73965..74673),
-    (r"Atlantic/Azores", 167457..168858),
-    (r"Atlantic/Bermuda", 144058..145082),
+    (r"Asia/Yekaterinburg", 92341..93101),
+    (r"Asia/Yerevan", 73980..74688),
+    (r"Atlantic/Azores", 167472..168873),
+    (r"Atlantic/Bermuda", 144073..145097),
     (r"Atlantic/Canary", 33169..33647),
     (r"Atlantic/Cape_Verde", 9164..9339),
     (r"Atlantic/Faeroe", 29129..29570),
     (r"Atlantic/Faroe", 29129..29570),
-    (r"Atlantic/Jan_Mayen", 63335..64040),
-    (r"Atlantic/Madeira", 166085..167457),
+    (r"Atlantic/Jan_Mayen", 63350..64055),
+    (r"Atlantic/Madeira", 166100..167472),
     (r"Atlantic/Reykjavik", 3982..4112),
     (r"Atlantic/South_Georgia", 3585..3717),
     (r"Atlantic/St_Helena", 3982..4112),
-    (r"Atlantic/Stanley", 101581..102370),
-    (r"Australia/ACT", 117075..117979),
-    (r"Australia/Adelaide", 121751..122672),
+    (r"Atlantic/Stanley", 101596..102385),
+    (r"Australia/ACT", 117090..117994),
+    (r"Australia/Adelaide", 121766..122687),
     (r"Australia/Brisbane", 19147..19436),
-    (r"Australia/Broken_Hill", 125593..126534),
-    (r"Australia/Canberra", 117075..117979),
-    (r"Australia/Currie", 143055..144058),
+    (r"Australia/Broken_Hill", 125608..126549),
+    (r"Australia/Canberra", 117090..117994),
+    (r"Australia/Currie", 143070..144073),
     (r"Australia/Darwin", 16263..16497),
     (r"Australia/Eucla", 20379..20693),
-    (r"Australia/Hobart", 143055..144058),
-    (r"Australia/LHI", 59243..59935),
+    (r"Australia/Hobart", 143070..144073),
+    (r"Australia/LHI", 59258..59950),
     (r"Australia/Lindeman", 21062..21387),
-    (r"Australia/Lord_Howe", 59243..59935),
-    (r"Australia/Melbourne", 117979..118883),
+    (r"Australia/Lord_Howe", 59258..59950),
+    (r"Australia/Melbourne", 117994..118898),
     (r"Australia/North", 16263..16497),
-    (r"Australia/NSW", 117075..117979),
+    (r"Australia/NSW", 117090..117994),
     (r"Australia/Perth", 20073..20379),
     (r"Australia/Queensland", 19147..19436),
-    (r"Australia/South", 121751..122672),
-    (r"Australia/Sydney", 117075..117979),
-    (r"Australia/Tasmania", 143055..144058),
-    (r"Australia/Victoria", 117979..118883),
+    (r"Australia/South", 121766..122687),
+    (r"Australia/Sydney", 117090..117994),
+    (r"Australia/Tasmania", 143070..144073),
+    (r"Australia/Victoria", 117994..118898),
     (r"Australia/West", 20073..20379),
-    (r"Australia/Yancowinna", 125593..126534),
+    (r"Australia/Yancowinna", 125608..126549),
     (r"Brazil/Acre", 28274..28692),
     (r"Brazil/DeNoronha", 36591..37075),
-    (r"Brazil/East", 137101..138053),
+    (r"Brazil/East", 137116..138068),
     (r"Brazil/West", 27862..28274),
-    (r"Canada/Atlantic", 177937..179609),
-    (r"Canada/Central", 162152..163446),
-    (r"Canada/Eastern", 179609..181326),
-    (r"Canada/Mountain", 133152..134122),
-    (r"Canada/Newfoundland", 186654..188532),
-    (r"Canada/Pacific", 164755..166085),
-    (r"Canada/Saskatchewan", 55280..55918),
-    (r"Canada/Yukon", 140997..142026),
-    (r"CET", 151439..152542),
-    (r"Chile/Continental", 194648..196002),
-    (r"Chile/EasterIsland", 193474..194648),
-    (r"CST6CDT", 183070..184824),
-    (r"Cuba", 153627..154744),
-    (r"EET", 57903..58585),
-    (r"Egypt", 163446..164755),
-    (r"Eire", 171769..173265),
+    (r"Canada/Atlantic", 177944..179616),
+    (r"Canada/Central", 162167..163461),
+    (r"Canada/Eastern", 179616..181333),
+    (r"Canada/Mountain", 133167..134137),
+    (r"Canada/Newfoundland", 186657..188535),
+    (r"Canada/Pacific", 164770..166100),
+    (r"Canada/Saskatchewan", 54642..55280),
+    (r"Canada/Yukon", 141012..142041),
+    (r"CET", 151454..152557),
+    (r"Chile/Continental", 194653..196007),
+    (r"Chile/EasterIsland", 193479..194653),
+    (r"CST6CDT", 183077..184831),
+    (r"Cuba", 153642..154759),
+    (r"EET", 57918..58600),
+    (r"Egypt", 163461..164770),
+    (r"Eire", 171784..173272),
     (r"EST", 5647..5796),
-    (r"EST5EDT", 181326..183070),
+    (r"EST5EDT", 181333..183077),
     (r"Etc/GMT", 113..224),
     (r"Etc/GMT+0", 113..224),
     (r"Etc/GMT+1", 3182..3295),
@@ -427,79 +427,79 @@ pub(super) static TZNAME_TO_OFFSET: &[(&str, core::ops::Range<usize>)] = &[
     (r"Etc/Universal", 224..335),
     (r"Etc/UTC", 224..335),
     (r"Etc/Zulu", 224..335),
-    (r"Europe/Amsterdam", 151439..152542),
+    (r"Europe/Amsterdam", 151454..152557),
     (r"Europe/Andorra", 23884..24273),
-    (r"Europe/Astrakhan", 81905..82631),
-    (r"Europe/Athens", 57903..58585),
-    (r"Europe/Belfast", 176338..177937),
+    (r"Europe/Astrakhan", 81920..82646),
+    (r"Europe/Athens", 57918..58600),
+    (r"Europe/Belfast", 176345..177944),
     (r"Europe/Belgrade", 34563..35041),
-    (r"Europe/Berlin", 63335..64040),
-    (r"Europe/Bratislava", 68994..69717),
-    (r"Europe/Brussels", 151439..152542),
-    (r"Europe/Bucharest", 57242..57903),
-    (r"Europe/Budapest", 97651..98417),
+    (r"Europe/Berlin", 63350..64055),
+    (r"Europe/Bratislava", 69009..69732),
+    (r"Europe/Brussels", 151454..152557),
+    (r"Europe/Bucharest", 57257..57918),
+    (r"Europe/Budapest", 97666..98432),
     (r"Europe/Busingen", 35041..35538),
-    (r"Europe/Chisinau", 64731..65486),
-    (r"Europe/Copenhagen", 63335..64040),
-    (r"Europe/Dublin", 171769..173265),
-    (r"Europe/Gibraltar", 155944..157164),
-    (r"Europe/Guernsey", 176338..177937),
+    (r"Europe/Chisinau", 64746..65501),
+    (r"Europe/Copenhagen", 63350..64055),
+    (r"Europe/Dublin", 171784..173272),
+    (r"Europe/Gibraltar", 155959..157179),
+    (r"Europe/Guernsey", 176345..177944),
     (r"Europe/Helsinki", 32688..33169),
-    (r"Europe/Isle_of_Man", 176338..177937),
-    (r"Europe/Istanbul", 154744..155944),
-    (r"Europe/Jersey", 176338..177937),
-    (r"Europe/Kaliningrad", 113444..114348),
+    (r"Europe/Isle_of_Man", 176345..177944),
+    (r"Europe/Istanbul", 154759..155959),
+    (r"Europe/Jersey", 176345..177944),
+    (r"Europe/Kaliningrad", 113459..114363),
     (r"Europe/Kiev", 38043..38601),
-    (r"Europe/Kirov", 78259..78994),
+    (r"Europe/Kirov", 78274..79009),
     (r"Europe/Kyiv", 38043..38601),
-    (r"Europe/Lisbon", 168858..170321),
+    (r"Europe/Lisbon", 168873..170336),
     (r"Europe/Ljubljana", 34563..35041),
-    (r"Europe/London", 176338..177937),
-    (r"Europe/Luxembourg", 151439..152542),
-    (r"Europe/Madrid", 111648..112545),
-    (r"Europe/Malta", 126534..127462),
+    (r"Europe/London", 176345..177944),
+    (r"Europe/Luxembourg", 151454..152557),
+    (r"Europe/Madrid", 111663..112560),
+    (r"Europe/Malta", 126549..127477),
     (r"Europe/Mariehamn", 32688..33169),
-    (r"Europe/Minsk", 99190..99998),
-    (r"Europe/Monaco", 150334..151439),
-    (r"Europe/Moscow", 109860..110768),
+    (r"Europe/Minsk", 99205..100013),
+    (r"Europe/Monaco", 150349..151454),
+    (r"Europe/Moscow", 109875..110783),
     (r"Europe/Nicosia", 44735..45332),
-    (r"Europe/Oslo", 63335..64040),
-    (r"Europe/Paris", 150334..151439),
+    (r"Europe/Oslo", 63350..64055),
+    (r"Europe/Paris", 150349..151454),
     (r"Europe/Podgorica", 34563..35041),
-    (r"Europe/Prague", 68994..69717),
-    (r"Europe/Riga", 55918..56612),
-    (r"Europe/Rome", 129371..130318),
-    (r"Europe/Samara", 82631..83363),
-    (r"Europe/San_Marino", 129371..130318),
+    (r"Europe/Prague", 69009..69732),
+    (r"Europe/Riga", 55280..55974),
+    (r"Europe/Rome", 129386..130333),
+    (r"Europe/Samara", 82646..83378),
+    (r"Europe/San_Marino", 129386..130333),
     (r"Europe/Sarajevo", 34563..35041),
-    (r"Europe/Saratov", 79726..80452),
-    (r"Europe/Simferopol", 107259..108124),
+    (r"Europe/Saratov", 79741..80467),
+    (r"Europe/Simferopol", 107274..108139),
     (r"Europe/Skopje", 34563..35041),
     (r"Europe/Sofia", 43540..44132),
-    (r"Europe/Stockholm", 63335..64040),
+    (r"Europe/Stockholm", 63350..64055),
     (r"Europe/Tallinn", 53967..54642),
     (r"Europe/Tirane", 45332..45936),
-    (r"Europe/Tiraspol", 64731..65486),
-    (r"Europe/Ulyanovsk", 93086..93846),
+    (r"Europe/Tiraspol", 64746..65501),
+    (r"Europe/Ulyanovsk", 93101..93861),
     (r"Europe/Uzhgorod", 38043..38601),
     (r"Europe/Vaduz", 35041..35538),
-    (r"Europe/Vatican", 129371..130318),
-    (r"Europe/Vienna", 58585..59243),
+    (r"Europe/Vatican", 129386..130333),
+    (r"Europe/Vienna", 58600..59258),
     (r"Europe/Vilnius", 50178..50854),
-    (r"Europe/Volgograd", 87813..88566),
-    (r"Europe/Warsaw", 116152..117075),
+    (r"Europe/Volgograd", 87828..88581),
+    (r"Europe/Warsaw", 116167..117090),
     (r"Europe/Zagreb", 34563..35041),
     (r"Europe/Zaporozhye", 38043..38601),
     (r"Europe/Zurich", 35041..35538),
     (r"Factory", 0..113),
-    (r"GB", 176338..177937),
-    (r"GB-Eire", 176338..177937),
+    (r"GB", 176345..177944),
+    (r"GB-Eire", 176345..177944),
     (r"GMT", 113..224),
     (r"GMT+0", 113..224),
     (r"GMT-0", 113..224),
     (r"GMT0", 113..224),
     (r"Greenwich", 113..224),
-    (r"Hongkong", 100806..101581),
+    (r"Hongkong", 100821..101596),
     (r"HST", 13910..14131),
     (r"Iceland", 3982..4112),
     (r"Indian/Antananarivo", 12063..12254),
@@ -513,27 +513,27 @@ pub(super) static TZNAME_TO_OFFSET: &[(&str, core::ops::Range<usize>)] = &[
     (r"Indian/Mauritius", 11335..11514),
     (r"Indian/Mayotte", 12063..12254),
     (r"Indian/Reunion", 4511..4644),
-    (r"Iran", 103161..103973),
-    (r"Israel", 192400..193474),
+    (r"Iran", 103176..103988),
+    (r"Israel", 192405..193479),
     (r"Jamaica", 21737..22076),
     (r"Japan", 15360..15573),
     (r"Kwajalein", 12882..13101),
     (r"Libya", 29570..30001),
-    (r"MET", 151439..152542),
-    (r"Mexico/BajaNorte", 149255..150334),
-    (r"Mexico/BajaSur", 66168..66858),
-    (r"Mexico/General", 98417..99190),
+    (r"MET", 151454..152557),
+    (r"Mexico/BajaNorte", 149270..150349),
+    (r"Mexico/BajaSur", 66183..66873),
+    (r"Mexico/General", 98432..99205),
     (r"MST", 16966..17206),
-    (r"MST7MDT", 147168..148210),
-    (r"Navajo", 147168..148210),
-    (r"NZ", 145082..146125),
-    (r"NZ-CHAT", 99998..100806),
+    (r"MST7MDT", 147183..148225),
+    (r"Navajo", 147183..148225),
+    (r"NZ", 145097..146140),
+    (r"NZ-CHAT", 100013..100821),
     (r"Pacific/Apia", 24648..25055),
-    (r"Pacific/Auckland", 145082..146125),
+    (r"Pacific/Auckland", 145097..146140),
     (r"Pacific/Bougainville", 12254..12455),
-    (r"Pacific/Chatham", 99998..100806),
+    (r"Pacific/Chatham", 100013..100821),
     (r"Pacific/Chuuk", 6705..6859),
-    (r"Pacific/Easter", 193474..194648),
+    (r"Pacific/Easter", 193479..194653),
     (r"Pacific/Efate", 22076..22418),
     (r"Pacific/Enderbury", 8134..8306),
     (r"Pacific/Fakaofo", 5796..5949),
@@ -572,30 +572,30 @@ pub(super) static TZNAME_TO_OFFSET: &[(&str, core::ops::Range<usize>)] = &[
     (r"Pacific/Wake", 3717..3851),
     (r"Pacific/Wallis", 3717..3851),
     (r"Pacific/Yap", 6705..6859),
-    (r"Poland", 116152..117075),
-    (r"Portugal", 168858..170321),
+    (r"Poland", 116167..117090),
+    (r"Portugal", 168873..170336),
     (r"PRC", 25461..25854),
-    (r"PST8PDT", 160858..162152),
+    (r"PST8PDT", 160873..162167),
     (r"ROC", 39103..39614),
     (r"ROK", 27038..27453),
     (r"Singapore", 15104..15360),
-    (r"Turkey", 154744..155944),
+    (r"Turkey", 154759..155959),
     (r"UCT", 224..335),
     (r"Universal", 224..335),
-    (r"US/Alaska", 124616..125593),
-    (r"US/Aleutian", 122672..123641),
+    (r"US/Alaska", 124631..125608),
+    (r"US/Aleutian", 122687..123656),
     (r"US/Arizona", 16966..17206),
-    (r"US/Central", 183070..184824),
+    (r"US/Central", 183077..184831),
     (r"US/East-Indiana", 36060..36591),
-    (r"US/Eastern", 181326..183070),
+    (r"US/Eastern", 181333..183077),
     (r"US/Hawaii", 13910..14131),
-    (r"US/Indiana-Starke", 139981..140997),
-    (r"US/Michigan", 112545..113444),
-    (r"US/Mountain", 147168..148210),
-    (r"US/Pacific", 160858..162152),
+    (r"US/Indiana-Starke", 139996..141012),
+    (r"US/Michigan", 112560..113459),
+    (r"US/Mountain", 147183..148225),
+    (r"US/Pacific", 160873..162167),
     (r"US/Samoa", 5197..5343),
     (r"UTC", 224..335),
-    (r"W-SU", 109860..110768),
-    (r"WET", 168858..170321),
+    (r"W-SU", 109875..110783),
+    (r"WET", 168873..170336),
     (r"Zulu", 224..335),
 ];
diff --git a/src/tz/db/mod.rs b/src/tz/db/mod.rs
index e2cf96d..5475aad 100644
--- a/src/tz/db/mod.rs
+++ b/src/tz/db/mod.rs
@@ -371,7 +371,56 @@ impl TimeZoneDatabase {
     /// available. To query whether the data is empty or not, use
     /// [`TimeZoneDatabase::is_definitively_empty`].
     ///
+    /// # Data generation
+    ///
+    /// The data in this crate comes from the [IANA Time Zone Database] "data
+    /// only" distribution. [`jiff-cli`] is used to first compile the release
+    /// into binary TZif data using the `zic` compiler, and secondly, converts
+    /// the binary data into a flattened and de-duplicated representation that
+    /// is embedded into this crate's source code.
+    ///
+    /// The conversion into the TZif binary data uses the following settings:
+    ///
+    /// * The "rearguard" data is used (see below).
+    /// * The binary data itself is compiled using the "slim" format. Which
+    ///   effectively means that the TZif data primarily only uses explicit
+    ///   time zone transitions for historical data and POSIX time zones for
+    ///   current time zone transition rules. This doesn't have any impact
+    ///   on the actual results. The reason that there are "slim" and "fat"
+    ///   formats is to support legacy applications that can't deal with
+    ///   POSIX time zones. For example, `/usr/share/zoneinfo` on my modern
+    ///   Archlinux installation (2025-02-27) is in the "fat" format.
+    ///
+    /// The reason that rearguard data is used is a bit more subtle and has
+    /// to do with a difference in how the IANA Time Zone Database treats its
+    /// internal "daylight saving time" flag and what people in the "real
+    /// world" consider "daylight saving time." For example, in the standard
+    /// distribution of the IANA Time Zone Database, `Europe/Dublin` has its
+    /// daylight saving time flag set to _true_ during Winter and set to
+    /// _false_ during Summer. The actual time shifts are the same as, e.g.,
+    /// `Europe/London`, but which one is actually labeled "daylight saving
+    /// time" is not.
+    ///
+    /// The IANA Time Zone Database does this for `Europe/Dublin`, presumably,
+    /// because _legally_, time during the Summer in Ireland is called `Irish
+    /// Standard Time`, and time during the Winter is called `Greenwich Mean
+    /// Time`. These legal names are reversed from what is typically the case,
+    /// where "standard" time is during the Winter and daylight saving time is
+    /// during the Summer. The IANA Time Zone Database implements this tweak in
+    /// legal language via a "negative daylight saving time offset." This is
+    /// somewhat odd, and some consumers of the IANA Time Zone Database cannot
+    /// handle it. Thus, the rearguard format was born for, seemingly, legacy
+    /// programs.
+    ///
+    /// Jiff can handle negative daylight saving time offsets just fine,
+    /// but we use the rearguard format anyway so that the underlying data
+    /// more accurately reflects on-the-ground reality for humans living in
+    /// `Europe/Dublin`. In particular, using the rearguard data enables
+    /// [localization of time zone names] to be done correctly.
+    ///
     /// [IANA Time Zone Database]: https://en.wikipedia.org/wiki/Tz_database
+    /// [`jiff-cli`]: https://github.com/BurntSushi/jiff/tree/master/crates/jiff-cli
+    /// [localization of time zone names]: https://github.com/BurntSushi/jiff/issues/258
     pub fn bundled() -> TimeZoneDatabase {
         let db = bundled::Database::new();
         if db.is_definitively_empty() {


Test patch: