views:

615

answers:

3

Let's consider the following code:

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy", Locale.US);
long start = sdf.parse("10:30:00 30/09/2009").getTime();
long end = sdf.parse("10:30:00 30/10/2009").getTime();

Calendar c = Calendar.getInstance(Locale.US);
c.setTimeInMillis(start);
System.out.println("Start = " + c.getTime());
c.setTimeInMillis(end);
System.out.println("  End = " + c.getTime());

When running this code snippet, I have the following output:

Start = Wed Sep 30 10:30:00 CEST 2009
  End = Fri Oct 30 10:30:00 CET 2009

Why do I get different timezone ?

Note that if I set the first date in august and the second one in september, the output will display the same timezone in both cases:

long start = sdf.parse("10:30:00 30/08/2009").getTime();
long end = sdf.parse("10:30:00 30/09/2009").getTime();

will display:

Start = Sun Aug 30 10:30:00 CEST 2009
  End = Wed Sep 30 10:30:00 CEST 2009

I'm using Java 1.6.0_14

+1  A: 

CEST is Central European Summer Time. It is the same as CET with daylight savings into effect.

kgiannakakis
That's what I suspected, but then how can I get rid of this daylight saving time?
romaintaz
Why do you want to get rid of it? CET is -01:00 whereas CEST is -02:00 (hours of difference from GMT time, for which daylight savings are never applied). This the convention for timezones and you shouldn't break it. What exactly are you trying to achieve? Is this a presentation or a calculation issue?
kgiannakakis
A: 

Yes, it is related to the daylight saving time. If you use a time zone that recognizes DST, it will be automatically used. You can use GMT for example if you don't want this.

nanda
+1  A: 

You can set the default time zone

    import java.util.TimeZone;
...        
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));  // or "Etc/GMT-1"

    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy", Locale.US);
    long start = sdf.parse("10:30:00 30/09/2009").getTime();
    long end = sdf.parse("10:30:00 30/10/2009").getTime();

    Calendar c = Calendar.getInstance(Locale.US);
    c.setTimeInMillis(start);
    System.out.println("Start = " + c.getTime());
    c.setTimeInMillis(end);
    System.out.println("  End = " + c.getTime());

use TimeZone.getAvailableIDs() to see all available IDs.

EDIT: you can also use a new SimpleTimeZone

    TimeZone.setDefault(new SimpleTimeZone(60 * 60 * 1000, "CET"));
Carlos Heuberger