-
Bug
-
Resolution: Duplicate
-
P4
-
None
-
7u85, 8u51
-
x86_64
-
windows_7
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 ----------
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 ----------
- duplicates
-
JDK-8132358 Gregorian calendar gives incorrect date while setting HOUR for DST
-
- Closed
-
-
JDK-8132358 Gregorian calendar gives incorrect date while setting HOUR for DST
-
- Closed
-