-
Bug
-
Resolution: Won't Fix
-
P4
-
None
-
1.4.2
-
x86
-
linux
FULL PRODUCT VERSION :
java version "1.4.2_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-b04)
Java HotSpot(TM) Client VM (build 1.4.2_05-b04, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Linux styx 2.6.5-1.358 #1 Sat May 8 09:04:50 EDT 2004 i686 i686 i386 GNU/Linux
A DESCRIPTION OF THE PROBLEM :
GregorianCalendar does not seem to work properly on January 1, 1900. Specifically, it behaves as if that day lasts more than a normal day.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
GregorianCalendar cal1 = new GregorianCalendar(1900, 0, 1);
GregorianCalendar cal2 = new GregorianCalendar(1900, 0, 2);
long diff = cal2.getTime().getTime() - cal1.getTime().getTime();
if (diff != 86400000) {
System.out.println("Date " + cal1.getTime()
+ " seems to have " + diff + " millis.");
}
GregorianCalendar cal3 = new GregorianCalendar(1900, 0, 3);
diff = cal3.getTime().getTime() - cal2.getTime().getTime();
if (diff != 86400000) {
System.out.println("Date " + cal1.getTime()
+ " seems to have " + diff + " millis.");
}
cal1.add(Calendar.DAY_OF_YEAR, 1); // should get to January 2
if (cal1.before(cal2)) {
System.out.println("Adding 1 day to January 1st, 1900"
+ " got us " + cal1.getTime());
}
GregorianCalendar cal_h1 = new GregorianCalendar(1900, 0, 1);
cal_h1.set(Calendar.HOUR, 1);
GregorianCalendar cal_h2 = new GregorianCalendar(1900, 0, 1);
cal_h2.set(Calendar.HOUR, 2);
diff = cal_h2.getTime().getTime() - cal_h1.getTime().getTime();
if (diff != 3600000) {
System.out.println("Hour has " + diff + " millis.");
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
no output
ACTUAL -
Date Mon Jan 01 00:00:00 EET 1900 seems to have 87908000 millis.
Adding 1 day to January 1st, 1900 got us Mon Jan 01 23:34:52 EET 1900
Hour has 5108000 millis.
REPRODUCIBILITY :
This bug can be reproduced always.
CUSTOMER SUBMITTED WORKAROUND :
import java.util.Calendar;
import java.util.GregorianCalendar;
public class CalendarTest {
// timezone is EET in what follows
public static void main(String[] args) {
GregorianCalendar cal1 = new GregorianCalendar(1900, 0, 1);
GregorianCalendar cal2 = new GregorianCalendar(1900, 0, 2);
long diff = cal2.getTime().getTime() - cal1.getTime().getTime();
if (diff != 86400000) {
System.out.println("Date " + cal1.getTime()
+ " seems to have " + diff + " millis.");
}
GregorianCalendar cal3 = new GregorianCalendar(1900, 0, 3);
diff = cal3.getTime().getTime() - cal2.getTime().getTime();
if (diff != 86400000) {
System.out.println("Date " + cal1.getTime()
+ " seems to have " + diff + " millis.");
}
cal1.add(Calendar.DAY_OF_YEAR, 1); // should get to January 2
if (cal1.before(cal2)) {
System.out.println("Adding 1 day to January 1st, 1900"
+ " got us " + cal1.getTime());
}
GregorianCalendar cal_h1 = new GregorianCalendar(1900, 0, 1);
cal_h1.set(Calendar.HOUR, 1);
GregorianCalendar cal_h2 = new GregorianCalendar(1900, 0, 1);
cal_h2.set(Calendar.HOUR, 2);
diff = cal_h2.getTime().getTime() - cal_h1.getTime().getTime();
if (diff != 3600000) {
System.out.println("Hour has " + diff + " millis.");
}
}
}
java version "1.4.2_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-b04)
Java HotSpot(TM) Client VM (build 1.4.2_05-b04, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
Linux styx 2.6.5-1.358 #1 Sat May 8 09:04:50 EDT 2004 i686 i686 i386 GNU/Linux
A DESCRIPTION OF THE PROBLEM :
GregorianCalendar does not seem to work properly on January 1, 1900. Specifically, it behaves as if that day lasts more than a normal day.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
GregorianCalendar cal1 = new GregorianCalendar(1900, 0, 1);
GregorianCalendar cal2 = new GregorianCalendar(1900, 0, 2);
long diff = cal2.getTime().getTime() - cal1.getTime().getTime();
if (diff != 86400000) {
System.out.println("Date " + cal1.getTime()
+ " seems to have " + diff + " millis.");
}
GregorianCalendar cal3 = new GregorianCalendar(1900, 0, 3);
diff = cal3.getTime().getTime() - cal2.getTime().getTime();
if (diff != 86400000) {
System.out.println("Date " + cal1.getTime()
+ " seems to have " + diff + " millis.");
}
cal1.add(Calendar.DAY_OF_YEAR, 1); // should get to January 2
if (cal1.before(cal2)) {
System.out.println("Adding 1 day to January 1st, 1900"
+ " got us " + cal1.getTime());
}
GregorianCalendar cal_h1 = new GregorianCalendar(1900, 0, 1);
cal_h1.set(Calendar.HOUR, 1);
GregorianCalendar cal_h2 = new GregorianCalendar(1900, 0, 1);
cal_h2.set(Calendar.HOUR, 2);
diff = cal_h2.getTime().getTime() - cal_h1.getTime().getTime();
if (diff != 3600000) {
System.out.println("Hour has " + diff + " millis.");
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
no output
ACTUAL -
Date Mon Jan 01 00:00:00 EET 1900 seems to have 87908000 millis.
Adding 1 day to January 1st, 1900 got us Mon Jan 01 23:34:52 EET 1900
Hour has 5108000 millis.
REPRODUCIBILITY :
This bug can be reproduced always.
CUSTOMER SUBMITTED WORKAROUND :
import java.util.Calendar;
import java.util.GregorianCalendar;
public class CalendarTest {
// timezone is EET in what follows
public static void main(String[] args) {
GregorianCalendar cal1 = new GregorianCalendar(1900, 0, 1);
GregorianCalendar cal2 = new GregorianCalendar(1900, 0, 2);
long diff = cal2.getTime().getTime() - cal1.getTime().getTime();
if (diff != 86400000) {
System.out.println("Date " + cal1.getTime()
+ " seems to have " + diff + " millis.");
}
GregorianCalendar cal3 = new GregorianCalendar(1900, 0, 3);
diff = cal3.getTime().getTime() - cal2.getTime().getTime();
if (diff != 86400000) {
System.out.println("Date " + cal1.getTime()
+ " seems to have " + diff + " millis.");
}
cal1.add(Calendar.DAY_OF_YEAR, 1); // should get to January 2
if (cal1.before(cal2)) {
System.out.println("Adding 1 day to January 1st, 1900"
+ " got us " + cal1.getTime());
}
GregorianCalendar cal_h1 = new GregorianCalendar(1900, 0, 1);
cal_h1.set(Calendar.HOUR, 1);
GregorianCalendar cal_h2 = new GregorianCalendar(1900, 0, 1);
cal_h2.set(Calendar.HOUR, 2);
diff = cal_h2.getTime().getTime() - cal_h1.getTime().getTime();
if (diff != 3600000) {
System.out.println("Hour has " + diff + " millis.");
}
}
}