Java.util.Date, Locale e TimeZone - problemas

Galera,
Eu busquei aqui no fórum do GUJ, mas não achei a solução.

Eu quero pegar a data e hora atual do sistema. Eu usei as três maneiras abaixo:

[code]
Date d = new Date();
System.out.println( d );

    d = Calendar.getInstance( TimeZone.getTimeZone("GMT-03:00") ).getTime();
    System.out.println( d );
    
    TimeZone tz = new SimpleTimeZone(Calendar.ZONE_OFFSET, "GMT-03:00");
    Calendar ca = GregorianCalendar.getInstance(tz);
    d = ca.getTime();
    System.out.println( d );[/code]

Estou usando o Windows XP. E tanto rodando a app no JBoss, qaunto como standalone, a hora vem adiantada em duas horas.

Se agora for 15:50, ele me vem como 17:50.

Sugestões?

Primeira coisa - boas festas!
Segunda coisa - como você deve saber, java.util.Date sempre guarda o tempo em UTC, mas Date.toString() mostra o tempo conforme o default timezone. Veja se o seu default timezone não está zoado. Por exemplo, minha máquina mostra o tempo corretamente se o setting “Automatically adjust clock for daylight saving changes” estiver checado. Se não estiver, ele mostra uma hora adiantado.
O Java sempre acha que o “setting” do Windows está checado. Portanto ele sempre exige que a máquina esteja com o tempo UTC correto, e com o fuso correto.

import java.util.*;

class Test192 {
	public static void main(String[] args) {
		Date dt = new Date();
		System.out.println (TimeZone.getDefault());
/*
Minha máquina (Windows 2003, fuso horário corretamente ajustado, 
incluindo o setting [X]Automatically adjust clock for daylight saving 
changes,  e java -version mostra java version "1.4.2_06"):

sun.util.calendar.ZoneInfo[id="America/Sao_Paulo",offset=-10800000,dstSavings=36
00000,useDaylight=true,transitions=129,lastRule=java.util.SimpleTimeZone[id=Amer
ica/Sao_Paulo,offset=-10800000,dstSavings=3600000,useDaylight=true,startYear=0,s
tartMode=3,startMonth=9,startDay=8,startDayOfWeek=1,startTime=0,startTimeMode=0,
endMode=3,endMonth=1,endDay=15,endDayOfWeek=1,endTime=0,endTimeMode=0]]
 */		
	}
}
sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]

Então eu deveria configurar isso no Regional Settings do Windows?
Quanto ao lance do Horário de Verão já estava checked.

E eu to usando o Date para inserir no BD via PreparedStatement.

Weird!

ps: Feliz Natal e Ano Novo.

Puxa, é a primeira vez que vejo alguém com o default timezone = GMT.

Por causa do horário de verão, se agora é 16:41, o horário UTC é 18:41, mas isso é realmente esquisito.

Bom, talvez tenha algo a ver com as porcarias da rede Novell aqui.

Kra estava com esse mesmo problema e consegui resolver assim:

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class Teste {

	public static void main(String[] args) {
    
		TimeZone tz = TimeZone.getTimeZone("America/Sao_Paulo");
		TimeZone.setDefault(tz);
		Calendar ca = GregorianCalendar.getInstance(tz);
		
		System.out.println (ca.getTime());
	}

}

Alguem sabe se existe outra forma. Algo mais direto na JVM?

Valeu!

abraços!!

1 curtida

6 anos depois…

Informar à JVM o parâmetro do timezone correto que será usado:

-Duser.timezone=GMT-3

Exemplo:

java -Duser.timezone=GMT-3 minha.Classe

1 curtida