diff --git a/Cargo.lock b/Cargo.lock index aee6d98..bd56aa0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1123,7 +1123,7 @@ checksum = "3da647db441b5aad0454a41573a267edb82b67b82ca3b6a65d11c39ebce74a99" [[package]] name = "tzf-rs" -version = "0.4.7" +version = "0.4.8" dependencies = [ "anyhow", "bytes", diff --git a/Cargo.toml b/Cargo.toml index 76f2c6c..f7fe53e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ license = "MIT" name = "tzf-rs" readme = "README.md" repository = "https://github.com/ringsaturn/tzf-rs" -version = "0.4.7" +version = "0.4.8" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/src/lib.rs b/src/lib.rs index 690361b..729147d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -385,11 +385,25 @@ impl DefaultFinder { /// ``` #[must_use] pub fn get_tz_name(&self, lng: f64, lat: f64) -> &str { - let fuzzy_name = self.fuzzy_finder.get_tz_name(lng, lat); - if !fuzzy_name.is_empty() { - return fuzzy_name; + // The simplified polygon data contains some empty areas where not covered by any timezone. + // It's not a bug but a limitation of the simplified algorithm. + // + // To handle this, auto shift the point a little bit to find the nearest timezone. + for &dx in &[0.0, -0.001, 0.001] { + for &dy in &[0.0, -0.001, 0.001] { + let dlng = dx + lng; + let dlat = dy + lat; + let fuzzy_name = self.fuzzy_finder.get_tz_name(dlng, dlat); + if !fuzzy_name.is_empty() { + return fuzzy_name; + } + let name = self.finder.get_tz_name(dlng, dlat); + if !name.is_empty() { + return name; + } + } } - self.finder.get_tz_name(lng, lat) + "" } /// ```rust diff --git a/tests/default.rs b/tests/default.rs index 3940e2d..8c64119 100644 --- a/tests/default.rs +++ b/tests/default.rs @@ -17,6 +17,10 @@ mod tests { assert_eq!(finder.get_tz_name(-4.5706, 46.2747), "Etc/GMT"); assert_eq!(finder.get_tz_name(-73.7729, 38.3530), "Etc/GMT+5"); assert_eq!(finder.get_tz_name(114.1594, 22.3173), "Asia/Hong_Kong"); + + // Shenzhen actually, but we used a simplified polygon data. + assert_eq!(finder.get_tz_name(114.0668, 22.5153), "Asia/Hong_Kong"); + assert_eq!( finder.get_tz_name(12.452_899_553_691_935, 41.903_699_636_969_634), "Europe/Vatican"