From a0909c78b69cdb197a6e55a909855b9e4ecec4eb Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Wed, 26 Aug 2020 10:03:11 -0400 Subject: [PATCH] add unicode/linux tz mappings --- .../cobbzilla/util/time/UnicodeTimezone.java | 2 + .../util/time/linux-timezone-exceptions.json | 78 +++++++++++++++++++ .../util/time/LinuxTimezoneTest.java | 14 +++- 3 files changed, 91 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/cobbzilla/util/time/UnicodeTimezone.java b/src/main/java/org/cobbzilla/util/time/UnicodeTimezone.java index 37988df..19372b7 100644 --- a/src/main/java/org/cobbzilla/util/time/UnicodeTimezone.java +++ b/src/main/java/org/cobbzilla/util/time/UnicodeTimezone.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; import lombok.Getter; import lombok.Setter; +import lombok.ToString; import org.cobbzilla.util.string.StringUtil; import java.util.*; @@ -14,6 +15,7 @@ import static org.cobbzilla.util.daemon.ZillaRuntime.empty; import static org.cobbzilla.util.io.StreamUtil.loadResourceAsStream; import static org.cobbzilla.util.string.StringUtil.getPackagePath; +@ToString public class UnicodeTimezone implements Comparable { // we exclude these oddball timezones, since they have no good mapping to Linux timezones diff --git a/src/main/resources/org/cobbzilla/util/time/linux-timezone-exceptions.json b/src/main/resources/org/cobbzilla/util/time/linux-timezone-exceptions.json index 691c4de..ee2a673 100644 --- a/src/main/resources/org/cobbzilla/util/time/linux-timezone-exceptions.json +++ b/src/main/resources/org/cobbzilla/util/time/linux-timezone-exceptions.json @@ -4,6 +4,84 @@ "MST7MDT": "America/Denver", "PST8PDT": "America/Los_Angeles", "GMT": "UTC", + "Africa/Addis_Ababa": "Africa/Juba", + "Africa/Asmera": "Africa/Juba", + "Africa/Bamako": "UTC", + "Africa/Bangui": "Africa/Lagos", + "Africa/Banjul": "UTC", + "Africa/Blantyre": "Africa/Khartoum", + "Africa/Brazzaville": "Africa/Lagos", + "Africa/Bujumbura": "Africa/Khartoum", + "Africa/Conakry": "UTC", + "Africa/Dakar": "UTC", + "Africa/Dar_es_Salaam": "Africa/Juba", + "Africa/Djibouti": "Africa/Juba", + "Africa/Douala": "Africa/Lagos", + "Africa/Freetown": "UTC", + "Africa/Gaborone": "Africa/Khartoum", + "Africa/Harare": "Africa/Khartoum", + "Africa/Kampala": "Africa/Juba", + "Africa/Kigali": "Africa/Khartoum", + "Africa/Kinshasa": "Africa/Lagos", + "Africa/Libreville": "Africa/Lagos", + "Africa/Lome": "UTC", + "Africa/Luanda": "Africa/Lagos", + "Africa/Lubumbashi": "Africa/Khartoum", + "Africa/Lusaka": "Africa/Khartoum", + "Africa/Malabo": "Africa/Lagos", + "Africa/Maseru": "Africa/Johannesburg", + "Africa/Mbabane": "Africa/Johannesburg", + "Africa/Mogadishu": "Africa/Juba", + "Africa/Niamey": "Africa/Lagos", + "Africa/Nouakchott": "UTC", + "Africa/Ouagadougou": "UTC", + "Africa/Porto-Novo": "Africa/Lagos", + "America/Anguilla": "America/Martinique", + "America/Antigua": "America/Martinique", + "America/Aruba": "America/Martinique", + "America/Cayman": "America/New_York", + "America/Dominica": "America/Martinique", + "America/Godthab": "America/Nuuk", + "America/Grenada": "America/Martinique", + "America/Guadeloupe": "America/Martinique", + "America/Kralendijk": "America/Martinique", + "America/Lower_Princes": "America/Martinique", + "America/Marigot": "America/Martinique", + "America/Montserrat": "America/Martinique", + "America/St_Barthelemy": "America/Martinique", + "America/St_Kitts": "America/Martinique", + "America/St_Lucia": "America/Martinique", + "America/St_Thomas": "America/Martinique", + "America/St_Vincent": "America/Martinique", + "America/Tortola": "America/Martinique", + "Antarctica/McMurdo": "Pacific/Auckland", + "Arctic/Longyearbyen": "Europe/Oslo", + "Asia/Aden": "Asia/Riyadh", + "Asia/Bahrain": "Asia/Riyadh", + "Asia/Kuwait": "Asia/Riyadh", + "Asia/Muscat": "Asia/Dubai", + "Asia/Phnom_Penh": "Asia/Bangkok", + "Asia/Vientiane": "Asia/Bangkok", + "Atlantic/St_Helena": "UTC", + "Europe/Bratislava": "Europe/Vienna", + "Europe/Busingen": "Europe/Berlin", + "Europe/Guernsey": "Europe/London", + "Europe/Isle_of_Man": "Europe/London", + "Europe/Jersey": "Europe/London", + "Europe/Ljubljana": "Europe/Berlin", + "Europe/Mariehamn": "Europe/Stockholm", + "Europe/Podgorica": "Europe/Belgrade", + "Europe/San_Marino": "Europe/Rome", + "Europe/Sarajevo": "Europe/Belgrade", + "Europe/Skopje": "Europe/Belgrade", + "Europe/Vaduz": "Europe/Berlin", + "Europe/Vatican": "Europe/Rome", + "Europe/Zagreb": "Europe/Belgrade", + "Indian/Antananarivo": "Africa/Juba", + "Indian/Comoro": "Africa/Juba", + "Indian/Mayotte": "Africa/Juba", + "Pacific/Midway": "Pacific/Niue", + "Pacific/Saipan": "Australia/Brisbane", "America/Santa_Isabel": "America/Tijuana", "Pacific/Johnston": "Pacific/Honolulu", "Etc/Unknown": "UTC", diff --git a/src/test/java/org/cobbzilla/util/time/LinuxTimezoneTest.java b/src/test/java/org/cobbzilla/util/time/LinuxTimezoneTest.java index 2c2c082..2f975ce 100644 --- a/src/test/java/org/cobbzilla/util/time/LinuxTimezoneTest.java +++ b/src/test/java/org/cobbzilla/util/time/LinuxTimezoneTest.java @@ -2,21 +2,29 @@ package org.cobbzilla.util.time; import org.junit.Test; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import static org.cobbzilla.util.json.JsonUtil.COMPACT_MAPPER; import static org.cobbzilla.util.json.JsonUtil.json; import static org.cobbzilla.util.time.UnicodeTimezone.getAllUnicodeTimezones; -import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; public class LinuxTimezoneTest { @Test public void ensureLinuxTimezoneExistsForEveryUnicodeTimezone () throws Exception { final Collection allUnicode = getAllUnicodeTimezones(); + final List missing = new ArrayList<>(); for (UnicodeTimezone utz : allUnicode) { if (utz.deprecated()) continue; // skip deprecated time zones, we may not have a mapping and that is OK - final LinuxTimezone linuxForUnicode = LinuxTimezone.fromUnicode(utz); - assertNotNull("no LinuxTimezone found for utz="+json(utz, COMPACT_MAPPER), linuxForUnicode); + try { + final LinuxTimezone linuxForUnicode = LinuxTimezone.fromUnicode(utz); + if (linuxForUnicode == null) missing.add(utz); + } catch (Exception e) { + missing.add(utz); + } } + assertTrue("no LinuxTimezone found for Unicode zones=" + json(missing, COMPACT_MAPPER), missing.isEmpty()); } }