Re: java.util.Date() returns the time one hour slow during DTS change
Nadh wrote:
My system time zone set to "Europe/Paris", and the current date is 30-
Mar-2009
And the "current" time is what?
when i [sic] am reducing one day from this date object( taking back to th=
e
start of previous day) in this case a wrong date object being returned
( java.util.Date() returns the time one hour slow ).
Actually, it returns exactly what time the code you show asks for. It
is not "slow".
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
public class TimeIssue
{
public static void main(String[] args)
{
long DAILY = ( 24 * 60 * 60 * 1000 );
Here's the problem - you calculated a day as twenty-four hours. If it
happens to cross the spring Daylight Saving change, a day is twenty-
three hours, not twenty-four.
Calendar cal = new GregorianCalendar();
cal.set( Calendar.DAY_OF_MONTH, 29 );
cal.set( Calendar.MONTH, 2 );
And guess what? March 29, 2009, was the day the time changed to
Daylight Saving in Paris, France! That day was only twenty-three
hours long!
cal.set( Calendar.SECOND, 0 );
What happened to 'Calendar.HOUR_OF_DAY'?
long adjustedTime = 0;
Complicated, unnecessary step.
// convert completed minutes into milliseconds
adjustedTime = cal.get( Calendar.MINUTE ) * 60 =
* 1000;
Complicated, unnecessary step.
// convert completed hours into milliseconds
adjustedTime = adjustedTime + ( cal.get
( Calendar.HOUR_OF_DAY ) * 60 * 60 * 1000 );
Ditto.
adjustedTime = cal.getTime().getTime() -
adjustedTime;
Ditto.
System.out.println( new Date( adjustedTime ) )=
;
}
}
Why are you using such complicated (and incorrect) code, involving
'Date' and 'long', when the 'Calendar' class exists to handle all this
for you (and without error)?
Calendar cal = Calendar.getInstance();
cal.set( Calendar.YEAR, 2009 );
cal.set( Calendar.MONTH, 2 );
cal.set( Calendar.DAY_OF_MONTH, 29 );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
cal.set( Calendar.MILLISECOND , 0 );
--
Lew