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

Last day of Daylight saving gives incorrect value while setting hour

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: P4 P4
    • None
    • 7u85, 8u51
    • core-libs

      FULL PRODUCT VERSION :
      1.7.0_80

      ADDITIONAL OS VERSION INFORMATION :
      Reproduced in WIndows7, centos and Windows server 2012 r2

      EXTRA RELEVANT SYSTEM CONFIGURATION :
      jdk used is different flavours of 1.7(1.7.0_55 and 1.7.0_80)

      A DESCRIPTION OF THE PROBLEM :
      Please run the following program and check the difference in output.
      Use the jvm arguments -Duser.timezone=PST while running.

      import java.sql.Time;
      import java.text.SimpleDateFormat;
      import java.util.Calendar;
      import java.util.Date;
      import java.util.GregorianCalendar;
      import java.util.TimeZone;

      public class Question {

      public static void main(String[] args) throws Exception{
      // TODO Auto-generated method stub

      SimpleDateFormat sdf = new SimpleDateFormat("dd-M-yyyy hh:mm:ss");
      sdf.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
      String dateInString = "06-11-2016 01:59:59";
      Date date = sdf.parse(dateInString);
      displayDates(date);
      System.out.println("Next date");
      dateInString = "09-11-2016 01:59:59";
      date = sdf.parse(dateInString);
      displayDates(date);


      }

      private static void displayDates(Date date){
      Time timeOffSet = Time.valueOf("23:59:59");
      TimeZone tz = TimeZone.getTimeZone("America/Adak");
      GregorianCalendar destTzCal = new GregorianCalendar(tz);
              destTzCal.setTimeInMillis(date.getTime());
              System.out.println("Time before setting offset: " + destTzCal.getTime());
              destTzCal.set(Calendar.HOUR_OF_DAY, timeOffSet.getHours());
              System.out.println("Time after setting offset: " + destTzCal.getTime());

      }

      }

      Output is:
      Time before setting offset: Sun Nov 06 01:59:59 PST 2016
      Time after setting offset: Mon Nov 07 01:59:59 PST 2016
      Next date
      Time before setting offset: Wed Nov 09 01:59:59 PST 2016
      Time after setting offset: Wed Nov 09 01:59:59 PST 2016

      The difference in America/Adak timezone and PST is 2 hours. When passing END_OF_THE_DAY of daylight saving day + 2 hours, we get an extra day added while executing destTzCal.set(Calendar.HOUR_OF_DAY, timeOffSet.getHours());

      It happens for every last day of the DST.(ie:
      31 October 2015 23:59:59:999 + 2 hours OR 1 November 2025 23:59:59:999 + 2 hours)



      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      as mentioned in description

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Time before setting offset: Sun Nov 06 01:59:59 PST 2016
      Time after setting offset: Mon Nov 06 01:59:59 PST 2016
      Next date
      Time before setting offset: Wed Nov 09 01:59:59 PST 2016
      Time after setting offset: Wed Nov 09 01:59:59 PST 2016
      ACTUAL -
      Time before setting offset: Sun Nov 06 01:59:59 PST 2016
      Time after setting offset: Mon Nov 07 01:59:59 PST 2016
      Next date
      Time before setting offset: Wed Nov 09 01:59:59 PST 2016
      Time after setting offset: Wed Nov 09 01:59:59 PST 2016

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      Use the jvm arguments -Duser.timezone=PST while running.

      import java.sql.Time;
      import java.text.SimpleDateFormat;
      import java.util.Calendar;
      import java.util.Date;
      import java.util.GregorianCalendar;
      import java.util.TimeZone;

      public class Question {

      public static void main(String[] args) throws Exception{
      // TODO Auto-generated method stub

      SimpleDateFormat sdf = new SimpleDateFormat("dd-M-yyyy hh:mm:ss");
      sdf.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
      String dateInString = "06-11-2016 01:59:59";
      Date date = sdf.parse(dateInString);
      displayDates(date);
      System.out.println("Next date");
      dateInString = "09-11-2016 01:59:59";
      date = sdf.parse(dateInString);
      displayDates(date);


      }

      private static void displayDates(Date date){
      Time timeOffSet = Time.valueOf("23:59:59");
      TimeZone tz = TimeZone.getTimeZone("America/Adak");
      GregorianCalendar destTzCal = new GregorianCalendar(tz);
              destTzCal.setTimeInMillis(date.getTime());
              System.out.println("Time before setting offset: " + destTzCal.getTime());
              destTzCal.set(Calendar.HOUR_OF_DAY, timeOffSet.getHours());
              System.out.println("Time after setting offset: " + destTzCal.getTime());

      }

      }
      ---------- END SOURCE ----------

            okutsu Masayoshi Okutsu
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: