Por exemplo, o seguinte programa na minha máquina dá dois resultados diferentes (com o JDK 1.4.2_05 e com o JDK 1.5.0):
import java.util.*;
class Test129 {
public static void main(String[] args) {
System.out.println (new Date());
TimeZone tz = TimeZone.getDefault();
System.out.println (tz);
}
}
Obs. O horário atual é 13:19 aproximadamente.
JDK 1.4.2_05:
Wed Oct 13 14:19:09 BRST 2004
sun.util.calendar.ZoneInfo[id="America/Sao_Paulo",offset=-10800000,dstSavings=3600000,useDaylight=true,transitions=129,lastRule=java.util.SimpleTimeZone[id=America/Sao_Paulo,offset=-10800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=9,startDay=8,startDayOfWeek=1,startTime=0,startTimeMode=0,endMode=3,endMonth=1,endDay=15,endDayOfWeek=1,endTime=0,endTimeMode=0]]
JDK 1.5.0:
Wed Oct 13 13:18:16 BRT 2004
sun.util.calendar.ZoneInfo[id="America/Sao_Paulo",offset=-10800000,dstSavings=3600000,useDaylight=true,transitions=129,lastRule=java.util.SimpleTimeZone[id=America/Sao_Paulo,offset=-10800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=9,startDay=15,startDayOfWeek=1,startTime=0,startTimeMode=0,endMode=3,endMonth=1,endDay=15,endDayOfWeek=1,endTime=0,endTimeMode=0]]
Para o JDK 1.5.0 o horário de verão começa no primeiro fim de semana depois do dia 15, e para o JDK 1.4.2_05, no primeiro fim de semana depois do dia 8.
Para meu Windows Server 2003 a regra é "primeiro fim de semana depois do dia 15".
Acho interessante você ver o que dá para fazer com "TimeZone", mais especificamente com o método "setDefault".