JDK-6609427 : (tz) GregorianCalendar - Zone Offset for Europe/London different than GMT!
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.util:i18n
  • Affected Version: 1.4.2
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_xp
  • CPU: x86
  • Submitted: 2007-09-26
  • Updated: 2010-07-29
  • Resolved: 2007-10-19
Related Reports
Duplicate :  
Description
FULL PRODUCT VERSION :
Tested (and fails) on:

java version "1.4.1_03"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_03-b02)
Java HotSpot(TM) Client VM (build 1.4.1_03-b02, mixed mode)

and

java version "1.4.2_08"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_08-b03)
Java HotSpot(TM) Client VM (build 1.4.2_08-b03, mixed mode)

and

java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-b64)
Java HotSpot(TM) Client VM (build 1.5.0-b64, mixed mode)


ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows 2000 [Version 5.00.2195] (SP 3)
and
Microsoft Windows XP [Version 5.1.2600] (SP 2)

A DESCRIPTION OF THE PROBLEM :
GregorianCalendar (actually, sun.util.calendar.ZoneInfo) seems to get the time-zone offset wrong when on Windows the 'Automatically Adjust Clock for Daylight Saving Changes' is enabled in Time Zone and the O/S is set up for the GMT time-zone.

Basically, here in the UK we always use GMT exactly.  Only Daylight Savings Time changes here for the summer, where we advance to 1 hour plus GMT; the time-zone always stays exactly the same.

However, the default time zone obtained from the JVM is Europe/London which appears to have a Time-zone value of 1 Hour plus GMT!

This is a nasty problem for those who parse times using SimpleDateFormat and then store away the milliseconds result, since it will invariably be wrong!

As a result, executing the following Java in the Europe/London time-zone:

System.out.println( new SimpleDateFormat( "yyyyMMddHHmmss" ).parse( "19700101000000" ).getTime() );

Gives -3600000 instead of 0!

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Run the test case provided.

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
When the 'Automatically Adjust for Daylight Savings time' flag is disabled or the sample code is run on a JVM that works (1.2.2 and 1.3.1_06 both seem to be OK) you should see the following displayed on the screen:

Europe/London Zone offset is : 0
Europe/London DST offset is  : 0
GMT Zone offset is : 0
GMT DST offset is  : 0
ACTUAL -
Europe/London Zone offset is : 3600000
Europe/London DST offset is  : 0
GMT Zone offset is : 0
GMT DST offset is  : 0

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class Timetest
{

    public static void main( String[] args ) throws Exception
    {

        // Show the problem using GregorianCalendar..
        GregorianCalendar cal = new GregorianCalendar();
        cal.setTimeZone( TimeZone.getTimeZone( "Europe/London" ) );
        cal.setTime( new Date( 0 ) );
        System.out.println( cal.getTimeZone().getID() + " Zone offset is : " + cal.get( Calendar.ZONE_OFFSET ) );
        System.out.println( cal.getTimeZone().getID() + " DST offset is  : " + cal.get( Calendar.DST_OFFSET ) );

        // On 00:00:00 01-01-1970 in  UK, GMT is time-zone, so output should be
        // the same.
        cal.setTimeZone( TimeZone.getTimeZone( "GMT" ) );
        cal.setTime( new Date( 0 ) );
        System.out.println( cal.getTimeZone().getID() + " Zone offset is : " + cal.get( Calendar.ZONE_OFFSET ) );
        System.out.println( cal.getTimeZone().getID() + " DST offset is  : " + cal.get( Calendar.DST_OFFSET ) );
     }

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