Index: src/main/java/java/util/TimeZone.java =================================================================== --- src/main/java/java/util/TimeZone.java (revision 662390) +++ src/main/java/java/util/TimeZone.java (working copy) @@ -72,6 +72,24 @@ AvailableZones.put(zones[i].getID(), zones[i]); } } + + private static boolean isAvailableIDInICU(String name) { + String[] availableIDs = com.ibm.icu.util.TimeZone.getAvailableIDs(); + for (int i = 0; i < availableIDs.length; i++) { + if (availableIDs[i].equals(name)) { + return true; + } + } + return false; + } + + private static void appendAvailableZones(String name) { + com.ibm.icu.util.TimeZone icuTZ = com.ibm.icu.util.TimeZone + .getTimeZone(name); + int raw = icuTZ.getRawOffset(); + TimeZone zone = new SimpleTimeZone(raw, name); + AvailableZones.put(name, zone); + } /** * Constructs a new instance of this class. @@ -104,16 +122,7 @@ * @return an array of time zone ID strings */ public static synchronized String[] getAvailableIDs() { - if (AvailableZones == null) { - initializeAvailable(); - } - int length = AvailableZones.size(); - String[] answer = new String[length]; - Iterator keys = AvailableZones.keySet().iterator(); - for (int i = 0; i < length; i++) { - answer[i] = keys.next(); - } - return answer; + return com.ibm.icu.util.TimeZone.getAvailableIDs(); } /** @@ -125,14 +134,13 @@ * @return an array of time zone ID strings */ public static synchronized String[] getAvailableIDs(int offset) { - if (AvailableZones == null) { - initializeAvailable(); - } - int count = 0, length = AvailableZones.size(); + String[] availableIDs = com.ibm.icu.util.TimeZone.getAvailableIDs(); + int count = 0; + int length = availableIDs.length; String[] all = new String[length]; - Iterator zones = AvailableZones.values().iterator(); for (int i = 0; i < length; i++) { - TimeZone tz = zones.next(); + com.ibm.icu.util.TimeZone tz = com.ibm.icu.util.TimeZone + .getTimeZone(availableIDs[i]); if (tz.getRawOffset() == offset) { all[count++] = tz.getID(); } @@ -303,7 +311,11 @@ initializeAvailable(); } - TimeZone zone = AvailableZones.get(name); + TimeZone zone = AvailableZones.get(name); + if(zone == null && isAvailableIDInICU(name)){ + appendAvailableZones(name); + zone = AvailableZones.get(name); + } if (zone == null) { if (name.startsWith("GMT") && name.length() > 3) { char sign = name.charAt(3); Index: src/test/api/common/org/apache/harmony/luni/tests/java/util/TimeZoneTest.java =================================================================== --- src/test/api/common/org/apache/harmony/luni/tests/java/util/TimeZoneTest.java (revision 662390) +++ src/test/api/common/org/apache/harmony/luni/tests/java/util/TimeZoneTest.java (working copy) @@ -18,6 +18,7 @@ package org.apache.harmony.luni.tests.java.util; import java.util.Calendar; +import java.util.Date; import java.util.Formatter; import java.util.GregorianCalendar; import java.util.Locale; @@ -147,8 +148,9 @@ "GMT+05:20", TimeZone.getTimeZone("GMT+520").getID()); assertEquals("Must return proper GMT formatted string for GMT+052 (eg. GMT+08:20).", "GMT+00:52", TimeZone.getTimeZone("GMT+052").getID()); - assertEquals("Must return proper GMT formatted string for GMT-0 (eg. GMT+08:20).", - "GMT-00:00", TimeZone.getTimeZone("GMT-0").getID()); + // GMT-0 is an available ID in ICU, so replace it with GMT-00 + assertEquals("Must return proper GMT formatted string for GMT-00 (eg. GMT+08:20).", + "GMT-00:00", TimeZone.getTimeZone("GMT-00").getID()); } /** @@ -188,6 +190,18 @@ } } + /* + * Regression for HARMONY-5860 + */ + public void test_GetTimezoneOffset() { + // America/Toronto is lazy initialized + TimeZone.setDefault(TimeZone.getTimeZone("America/Toronto")); + Date date = new Date(07, 2, 24); + assertEquals(300, date.getTimezoneOffset()); + date = new Date(99, 8, 1); + assertEquals(240, date.getTimezoneOffset()); + } + protected void setUp() { }