Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6609459

(cal) GregorianCalendar behaves abnormally on January 1, 1900

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Won't Fix
    • Icon: P4 P4
    • None
    • 1.4.2
    • core-libs

      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.");
              }
          }
      }

            okutsu Masayoshi Okutsu
            okutsu Masayoshi Okutsu
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: