Index: src/test/java/tests/api/java/util/GregorianCalendarTest.java =================================================================== --- src/test/java/tests/api/java/util/GregorianCalendarTest.java (revision 494772) +++ src/test/java/tests/api/java/util/GregorianCalendarTest.java (working copy) @@ -22,6 +22,7 @@ import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; +import java.util.SimpleTimeZone; import java.util.TimeZone; import java.util.Vector; @@ -139,6 +140,11 @@ // value assertTrue("Incorrect calendar returned", gc1.get(Calendar.HOUR) == ((gc2.get(Calendar.HOUR) + 1) % 12)); + + // Regression test for Haromny-2961 + SimpleTimeZone timezone = new SimpleTimeZone(-3600 * 24 * 1000 * 2, + "GMT"); + GregorianCalendar gc = new GregorianCalendar(timezone); } /** Index: src/main/java/java/util/GregorianCalendar.java =================================================================== --- src/main/java/java/util/GregorianCalendar.java (revision 494772) +++ src/main/java/java/util/GregorianCalendar.java (working copy) @@ -317,10 +317,11 @@ } // Cannot add ZONE_OFFSET to time as it might overflow millis += zoneOffset; - if (millis < 0) { + while (millis < 0) { millis += 86400000; days--; - } else if (millis >= 86400000) { + } + while (millis >= 86400000) { millis -= 86400000; days++; }