Index: src/main/java/java/util/GregorianCalendar.java =================================================================== --- src/main/java/java/util/GregorianCalendar.java (revision 648485) +++ src/main/java/java/util/GregorianCalendar.java (working copy) @@ -446,7 +446,9 @@ protected void computeFields() { int zoneOffset = getTimeZone().getRawOffset(); - fields[ZONE_OFFSET] = zoneOffset; + if(!isSet[ZONE_OFFSET]) { + fields[ZONE_OFFSET] = zoneOffset; + } int millis = (int) (time % 86400000); int savedMillis = millis; Index: src/test/api/common/org/apache/harmony/luni/tests/java/util/GregorianCalendarTest.java =================================================================== --- src/test/api/common/org/apache/harmony/luni/tests/java/util/GregorianCalendarTest.java (revision 648485) +++ src/test/api/common/org/apache/harmony/luni/tests/java/util/GregorianCalendarTest.java (working copy) @@ -753,6 +753,15 @@ assertEquals(0, gc.get(Calendar.SECOND)); gc.set(1582, Calendar.OCTOBER, 14, 0, 0, 0); assertEquals(24, gc.get(Calendar.DAY_OF_MONTH)); + + // Regression test for HARMONY-2422 + gc = new GregorianCalendar(TimeZone.getTimeZone("GMT")); + gc.set(GregorianCalendar.ZONE_OFFSET, -1); + assertEquals(-1, gc.get(GregorianCalendar.ZONE_OFFSET)); + gc.set(GregorianCalendar.ZONE_OFFSET, 1); + assertEquals(1, gc.get(GregorianCalendar.ZONE_OFFSET)); + gc.set(GregorianCalendar.ZONE_OFFSET, 0); + assertEquals(0, gc.get(GregorianCalendar.ZONE_OFFSET)); } /**