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) @@ -625,6 +625,18 @@ assertEquals(2, g1.get(Calendar.HOUR_OF_DAY)); // End of regression test } + + /** + * @tests java.util.GregorianCalendar#get(int) + */ + public void test_getI() { + // Regression test for Hamrony-2959 + Date date = new Date(Date.parse("Jan 15 00:00:01 GMT 2000")); + GregorianCalendar gc = new GregorianCalendar(); + gc.setGregorianChange(date); + gc.setTimeInMillis(Date.parse("Dec 24 00:00:01 GMT 2000")); + assertEquals(346, gc.get(Calendar.DAY_OF_YEAR)); + } /** * Sets up the fixture, for example, open a network connection. This method 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) @@ -759,10 +759,7 @@ } if (days < 0) { year = year - 1; - days = days + 365 + (isLeapYear(year) ? 1 : 0); - if (year == changeYear && localTime < gregorianCutover) { - days -= julianError(); - } + days = days + daysInYear(year); } fields[YEAR] = year; return (int) days + 1; @@ -799,15 +796,17 @@ return DaysInMonth[month]; } - private int daysInYear() { - int daysInYear = isLeapYear(fields[YEAR]) ? 366 : 365; - if (fields[YEAR] == changeYear) { + + private int daysInYear(int year) { + int daysInYear = isLeapYear(year) ? 366 : 365; + if (year == changeYear) { daysInYear -= currentYearSkew; } - if (fields[YEAR] == changeYear - 1) { + if (year == changeYear - 1) { daysInYear -= lastYearSkew; } return daysInYear; + } private int daysInYear(boolean leapYear, int month) { @@ -884,7 +883,7 @@ case DATE: return daysInMonth(); case DAY_OF_YEAR: - return daysInYear(); + return daysInYear(fields[YEAR]); case DAY_OF_WEEK_IN_MONTH: result = get(DAY_OF_WEEK_IN_MONTH) + ((daysInMonth() - get(DATE)) / 7); @@ -1116,7 +1115,7 @@ int days, day; if (field == WEEK_OF_YEAR) { - days = daysInYear(); + days = daysInYear(fields[YEAR]); day = DAY_OF_YEAR; } else { days = daysInMonth(); @@ -1147,7 +1146,7 @@ max = daysInMonth(); break; case DAY_OF_YEAR: - max = daysInYear(); + max = daysInYear(fields[YEAR]); break; case DAY_OF_WEEK: max = maximums[field];