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

Daylight saving problems in BET

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: P4 P4
    • None
    • 1.1.8
    • core-libs



      Name: sl110371 Date: 06/28/2000


      java version "1.1.8"

      I'm in Brazil and I?m trying to use daylight saving with JDK1.1.8. The switch
      time happens at 00:00 hrs. If we set the start switch date in Oct, 8th 2000
      00:00:00 and the end switch date to March , 5th 2000 00:00:00.
      In the start switch date we expect the following times:

        Sat Oct 07 22:00:00 GMT-3 2000
        Sat Oct 07 23:00:00 GMT-3 2000
        Sun Oct 08 01:00:00 GMT-2 2000
        Sun Oct 08 02:00:00 GMT-2 2000

      And in the end switch date we expect the following times:

        Sat Mar 04 22:00:00 GMT-02:00 2000
        Sat Mar 04 23:00:00 GMT-02:00 2000
        Sat Mar 04 23:00:00 GMT-03:00 2000
        Sun Mar 05 00:00:00 GMT-03:00 2000
        Sun Mar 05 01:00:00 GMT-03:00 2000

      I'm using the Brazilian TimeZone ("BET") and setting the daylight saving as
      explained above:

        SimpleTimeZone pdt = (SimpleTimeZone)TimeZone.getTimeZone("BET");
        Locale aLocale = new Locale("pt", "BR");
        Locale.setDefault(aLocale);
        pdt.setStartRule(9, 2, 1, 0);
        pdt.setEndRule(2, 1, 1, 0);
        TimeZone.setDefault(pdt);

      And the behavior of the dates in the end switch date is:

        Sat Mar 04 22:00:00 GMT-02:00 2000
        Sat Mar 04 23:00:00 GMT-02:00 2000
        Sun Mar 05 00:00:00 GMT-02:00 2000
        Sun Mar 05 00:00:00 GMT-03:00 2000
        Sun Mar 05 01:00:00 GMT-03:00 2000

      And for the start switch date, if I do a

        Date aDate = new Date(100,9,7,24,0,0);
        System.out.println("new Date(100,9,7,24,0,0): " + aDate.toString());
        aDate = new Date(aDate,2000,9,8,0,0,0);
        System.out.println("new Date(100,9,8,0,0,0): " + aDate.toString());

      The output is:

        new Date(100,9,7,24,0,0): Sun Oct 08 01:00:00 PDT 2000
        new Date(100,9,8,0,0,0): Sat Oct 07 23:00:00 PST 2000

      I have tried the following test

        SimpleTimeZone pdt = (SimpleTimeZone)TimeZone.getTimeZone("PST");
        Locale.setDefault(aLocale);
        pdt.setStartRule(9, 2, 1, 0);
        pdt.setEndRule(2, 1, 1, 0);
        TimeZone.setDefault(pdt);

      The behavior is the same, when I do a new Date in the non existing hour of the
      short day (new Date(aDate,2000,9,8,0,0,0);) instead of go to the Sun Oct 08
      01:00:00 PDT 2000 it goes to Sat Oct 07 23:00:00 PST 2000. And in the long day
      it goes twice to Sun Mar 05 00:00:00 instead of Sat Mar 04 23:00:00.

      Does anyone have any idea? Any suggestion would be very important to us.
      Thanks in advance.

      Source code:

      import java.io.File;
      import java.util.Vector;
      import java.util.SimpleTimeZone;
      import java.util.TimeZone;
      import java.util.Locale;
      import java.util.Calendar;
      import java.util.Date;
      import java.text.SimpleDateFormat;

      public class TestDriver implements Runnable
      {
          public final int YEAR = Calendar.YEAR;
          public final int MONTH = Calendar.MONTH;
          public final int DATE = Calendar.DATE;
          public final int HOUR = Calendar.HOUR;
          public final int MINUTE = Calendar.MINUTE;
          public final int SECOND = Calendar.SECOND;
          
          public static void main(String[] args)
          {
              Thread thread = new Thread(new TestDriver());
              thread.start();
          }
          public void add (Date aDate, int i, int unit)
          {
              Calendar myCalendar = (Calendar)Calendar.getInstance();
              myCalendar.setTime(aDate);
              myCalendar.setFirstDayOfWeek(Calendar.SUNDAY);
              myCalendar.setMinimalDaysInFirstWeek(7);
              myCalendar.set(unit, myCalendar.get(unit) + i);
              aDate.setTime(myCalendar.getTime().getTime());
          }
          public void set(Date aDate, int year, int month, int date, int hour, int
          minute, int second)
          {
              Calendar myCalendar = (Calendar)Calendar.getInstance();
              myCalendar.set(year, month, date, hour, minute, second);
              myCalendar.setFirstDayOfWeek(Calendar.SUNDAY);
              myCalendar.setMinimalDaysInFirstWeek(7);
              aDate.setTime(myCalendar.getTime().getTime());
              myCalendar.add(HOUR, 1);
          }

          public void run()
          {
                  Date aDate = new Date();
                  // Start 9;2;1;0 08/10/2000 00:00
                  // End 2;1;1;0 05/03/2000 00:00

                  SimpleTimeZone pdt = (SimpleTimeZone)TimeZone.getTimeZone("BET");
                  Locale aLocale = new Locale("pt", "BR");
                  Locale.setDefault(aLocale);
                  pdt.setStartRule(9, 2, 1, 0);
                  pdt.setEndRule(2, 1, 1, 0);
                  TimeZone.setDefault(pdt);
                  SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm zz",
                                                              aLocale);

                  System.out.println();
                  System.out.println("Start 9;2;1;0 08/10/2000 00:00");
                  System.out.println("End 2;1;1;0 05/03/2000 00:00");
                  System.out.println();
                  System.out.println("Constructor:");
                  this.set(aDate,2000,1,23,0,0,0);
                  System.out.println("new Date(100,1,23,0,0,0): " + sdf.format
      (aDate));
                  this.set(aDate,2000,2,4,22,0,0);
                  System.out.println("new Date(100,2,4,22,0,0): " + sdf.format
      (aDate));
                  this.set(aDate,2000,2,4,23,0,0);
                  System.out.println("new Date(100,2,4,23,0,0): " + sdf.format
      (aDate));
                  this.set(aDate,2000,2,4,24,0,0);
                  System.out.println("new Date(100,2,4,24,0,0): " + sdf.format
      (aDate));
                  this.set(aDate,2000,2,5,0,0,0);
                  System.out.println("new Date(100,2,5,0,0,0): " + sdf.format(aDate));
                  this.set(aDate,2000,2,5,1,0,0);
                  System.out.println("new Date(100,2,5,1,0,0): " + sdf.format(aDate));
                  this.set(aDate,2000,4,10,0,0,0);
                  System.out.println("new Date(100,4,10,0,0,0): " + sdf.format
      (aDate));
                  this.set(aDate,2000,9,7,23,0,0);
                  System.out.println("new Date(100,9,7,23,0,0): " + sdf.format
      (aDate));
                  this.set(aDate,2000,9,8,0,0,0);
                  System.out.println("new Date(100,9,8,0,0,0): " + sdf.format(aDate));
                  this.set(aDate,2000,9,8,1,0,0);
                  System.out.println("new Date(100,9,8,1,0,0): " + sdf.format(aDate));
                  this.set(aDate,2000,10,23,0,0,0);
                  System.out.println("new Date(100,10,23,0,0,0): " + sdf.format
      (aDate));

                  System.out.println();
                  System.out.println("Add minute:");
                  this.set(aDate,2000,1,23,0,0,0);
                  System.out.println("new Date(100,1,23,0,0,0): " + sdf.format
      (aDate));
                  this.add(aDate, 1, this.MINUTE);
                  System.out.println("add(1,MINUTE): " + sdf.format(aDate));
                  this.set(aDate,2000,2,4,22,59,0);
                  System.out.println("new Date(100,2,4,22,59,0): " + sdf.format
      (aDate));
                  this.add(aDate, 1, this.MINUTE);
                  System.out.println("add(1,MINUTE): " + sdf.format(aDate));
                  this.set(aDate,2000,2,4,23,59,0);
                  System.out.println("new Date(100,2,4,23,59,0): " + sdf.format
      (aDate));
                  this.add(aDate, 1, this.MINUTE);
                  System.out.println("add(1,MINUTE): " + sdf.format(aDate));
                  this.set(aDate,2000,2,5,0,0,0);
                  System.out.println("new Date(100,2,5,0,0,0): " + sdf.format(aDate));
                  this.add(aDate, 1, this.MINUTE);
                  System.out.println("add(1,MINUTE): " + sdf.format(aDate));
                  this.set(aDate,2000,4,10,0,0,0);
                  System.out.println("new Date(100,4,10,0,0,0): " + sdf.format
      (aDate));
                  this.add(aDate, 1, this.MINUTE);
                  System.out.println("add(1,MINUTE): " + sdf.format(aDate));
                  this.set(aDate,2000,9,7,23,59,0);
                  System.out.println("new Date(100,9,7,23,59,0): " + sdf.format
      (aDate));
                  this.add(aDate, 1, this.MINUTE);
                  System.out.println("add(1,MINUTE): " + sdf.format(aDate));
                  this.set(aDate,2000,9,8,0,0,0);
                  System.out.println("new Date(100,9,8,0,0,0): " + sdf.format(aDate));
                  this.add(aDate, 1, this.MINUTE);
                  System.out.println("add(1,MINUTE): " + sdf.format(aDate));
                  this.set(aDate,2000,10,23,0,0,0);
                  System.out.println("new Date(100,10,23,0,0,0): " + sdf.format
      (aDate));
                  this.add(aDate, 1, this.MINUTE);
                  System.out.println("add(1,MINUTE): " + sdf.format(aDate));
          }
      }

      Output:

      Start 9;2;1;0 08/10/2000 00:00
      End 2;1;1;0 05/03/2000 00:00

      Constructor:
      new Date(100,1,23,0,0,0): 23/02/2000 00:00 GMT-02:00
      new Date(100,2,4,22,0,0): 04/03/2000 22:00 GMT-02:00
      new Date(100,2,4,23,0,0): 04/03/2000 23:00 GMT-02:00
      new Date(100,2,4,24,0,0): 05/03/2000 00:00 GMT-02:00
      new Date(100,2,5,0,0,0): 05/03/2000 00:00 GMT-03:00
      new Date(100,2,5,1,0,0): 05/03/2000 01:00 GMT-03:00
      new Date(100,4,10,0,0,0): 10/05/2000 00:00 GMT-03:00
      new Date(100,9,7,23,0,0): 07/10/2000 23:00 GMT-03:00
      new Date(100,9,8,0,0,0): 07/10/2000 23:00 GMT-03:00
      new Date(100,9,8,1,0,0): 08/10/2000 01:00 GMT-02:00
      new Date(100,10,23,0,0,0): 23/11/2000 00:00 GMT-02:00

      Add minute:
      new Date(100,1,23,0,0,0): 23/02/2000 00:00 GMT-02:00
      add(1,MINUTE): 23/02/2000 00:01 GMT-02:00
      new Date(100,2,4,22,59,0): 04/03/2000 22:59 GMT-02:00
      add(1,MINUTE): 04/03/2000 23:00 GMT-02:00
      new Date(100,2,4,23,59,0): 04/03/2000 23:59 GMT-02:00
      add(1,MINUTE): 05/03/2000 00:00 GMT-02:00
      new Date(100,2,5,0,0,0): 05/03/2000 00:00 GMT-03:00
      add(1,MINUTE): 05/03/2000 00:01 GMT-03:00
      new Date(100,4,10,0,0,0): 10/05/2000 00:00 GMT-03:00
      add(1,MINUTE): 10/05/2000 00:01 GMT-03:00
      new Date(100,9,7,23,59,0): 07/10/2000 23:59 GMT-03:00
      add(1,MINUTE): 08/10/2000 01:00 GMT-02:00
      new Date(100,9,8,0,0,0): 07/10/2000 23:00 GMT-03:00
      add(1,MINUTE): 07/10/2000 23:01 GMT-03:00
      new Date(100,10,23,0,0,0): 23/11/2000 00:00 GMT-02:00
      add(1,MINUTE): 23/11/2000 00:01 GMT-02:00
      (Review ID: 106615)
      ======================================================================

            okutsu Masayoshi Okutsu
            duke J. Duke
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: