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

Gregorian calendar gives incorrect date while setting HOUR for DST

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Not an Issue
    • Icon: P4 P4
    • None
    • 7u80
    • core-libs

      FULL PRODUCT VERSION :
      1.7.0_80
      1.7.0_55

      ADDITIONAL OS VERSION INFORMATION :
      Windows7 64 bit, Windows 2012 r2 64 bit, centos 64 bit

      A DESCRIPTION OF THE PROBLEM :
      Difference in currentTimezone and Gregorian calendar's timezone is 2 hours(for the below code).
      Whenever we pass END_OF_DAY of DST + 2 hours to the below function it adds another day to the result.

      Setting the hour should not change the date and in case it is changing the date, it should change for all days and not only for END_OF_DAY of DST.

      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());

      }

      }

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      as per description

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Time before setting offset: Sun Nov 01 01:59:59 PST 2015
      Time after setting offset: Mon Nov 01 01:59:59 PST 2015
      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 01 01:59:59 PST 2015
      Time after setting offset: Mon Nov 02 01:59:59 PST 2015
      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:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: