From 1a653bcc6d3e0c5650886aba5c5a277cd49f0bbd Mon Sep 17 00:00:00 2001 From: patrick-zippenfenig Date: Fri, 12 Jan 2024 19:47:28 +0100 Subject: [PATCH] correct more timezones --- .../SwiftTimeZoneLookup.swift | 36 ++++++++++++++++++- .../SwiftTimeZoneLookupTests.swift | 12 +++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/Sources/SwiftTimeZoneLookup/SwiftTimeZoneLookup.swift b/Sources/SwiftTimeZoneLookup/SwiftTimeZoneLookup.swift index fbcc80e..075a6e8 100644 --- a/Sources/SwiftTimeZoneLookup/SwiftTimeZoneLookup.swift +++ b/Sources/SwiftTimeZoneLookup/SwiftTimeZoneLookup.swift @@ -108,7 +108,7 @@ public final class SwiftTimeZoneLookup { return SwiftTimeZoneLookupResult(timezone: timezone, countryName: countryName, countryAlpha2: countryAlpha2) } - /// Resolve the timz + /// Resolve the timezone public func simple(latitude: Float, longitude: Float) -> String? { if (36.2443...36.7389).contains(latitude) && (26.0019...26.7957).contains(longitude) { // Astypalaia island in Greece does not resolve any timezone and would return nil @@ -120,6 +120,40 @@ public final class SwiftTimeZoneLookup { return "America/Curacao" } + if let timezone = simpleUncorrected(latitude: latitude, longitude: longitude) { + return timezone + } + for delta in stride(from: Float(0.1), through: 2.35, by: 0.25) { + if let timezone = simpleUncorrected(latitude: latitude + delta, longitude: longitude) { + return timezone + } + if let timezone = simpleUncorrected(latitude: latitude - delta, longitude: longitude) { + return timezone + } + if let timezone = simpleUncorrected(latitude: latitude, longitude: longitude + delta) { + return timezone + } + if let timezone = simpleUncorrected(latitude: latitude, longitude: longitude - delta) { + return timezone + } + if let timezone = simpleUncorrected(latitude: latitude + delta, longitude: longitude + delta) { + return timezone + } + if let timezone = simpleUncorrected(latitude: latitude - delta, longitude: longitude + delta) { + return timezone + } + if let timezone = simpleUncorrected(latitude: latitude + delta, longitude: longitude - delta) { + return timezone + } + if let timezone = simpleUncorrected(latitude: latitude - delta, longitude: longitude - delta) { + return timezone + } + } + return nil + } + + /// Resolve the timezone without any corrections + private func simpleUncorrected(latitude: Float, longitude: Float) -> String? { guard let result = highResLookup(latitude: latitude, longitude: longitude) else { return nil } diff --git a/Tests/SwiftTimeZoneLookupTests/SwiftTimeZoneLookupTests.swift b/Tests/SwiftTimeZoneLookupTests/SwiftTimeZoneLookupTests.swift index f84fcca..a2295b5 100644 --- a/Tests/SwiftTimeZoneLookupTests/SwiftTimeZoneLookupTests.swift +++ b/Tests/SwiftTimeZoneLookupTests/SwiftTimeZoneLookupTests.swift @@ -26,5 +26,17 @@ final class SwiftTimeZoneLookupTests: XCTestCase { // https://github.com/open-meteo/open-meteo/issues/589 XCTAssertEqual(database.simple(latitude: 12.2, longitude: -68.97), "America/Curacao") + + // https://github.com/open-meteo/open-meteo/issues/591 + XCTAssertEqual(database.simple(latitude: 10.12, longitude: -64.70), "Etc/GMT+4") + XCTAssertEqual(database.simple(latitude: 12.13, longitude: -68.28), "America/Kralendijk") + XCTAssertEqual(database.simple(latitude: 10.61, longitude: -66.98), "Etc/GMT+4") + XCTAssertEqual(database.simple(latitude: 6.73 , longitude: -66.98), "America/Bogota") + XCTAssertEqual(database.simple(latitude: 12.05, longitude: -61.73), "America/Grenada") + XCTAssertEqual(database.simple(latitude: 10.97, longitude: -63.83), "Etc/GMT+4") + XCTAssertEqual(database.simple(latitude: 10.65, longitude: -61.52), "America/Grenada") + XCTAssertEqual(database.simple(latitude: 7.58, longitude: -72.07), "America/Bogota") + XCTAssertEqual(database.simple(latitude: 11.15, longitude: -60.84), "Etc/GMT+4") + XCTAssertEqual(database.simple(latitude: 10.15, longitude: -68.03), "Etc/GMT+5") } }