Obter objeto Date que representa a hora no GMT+00:00

Beleza?!

Estou tentando pegar um objeto java.util.Date que represente o horário no meridiano zero. Estou fazendo assim:

public class TestDate {
	public static void main(String[] args) {
		GregorianCalendar gc = new GregorianCalendar(TimeZone.getTimeZone("GMT+00:00"));
		
		System.out.println(gc.get(GregorianCalendar.HOUR_OF_DAY) + ":" + gc.get(GregorianCalendar.MINUTE));
		
		Date greenwhichDate = gc.getTime();
		
		System.out.println(greenwhichDate);
	}
}

E estou obtendo:

16:53
Thu Dec 16 14:53:07 BRST 2004

Quando, na minha máquina, são 14:53 mesmo. Na primeira linha o resultado é extamente o que eu quero, apesar de a gente estar em GMT-3 dá só duas horas de diferença por causa do horário de verão, mas o Date que eu imprimi usando gc.getTime() está apresentado o horário local. Ele não deveria representar o horário no GMT+0 também?

É esse mesmo o jeito certo de se obter um objeto Date que represente o horário de um fuso diferente?

Colé Jaú! :slight_smile:

Já tentou assim?

Calendar calendar = Calendar.getInstance(Locale.ENGLISH);
Date d = calendar.getTime();

Isso também não funciona. :frowning:

[quote=jau]Beleza?!

Estou tentando pegar um objeto java.util.Date que represente o horário no meridiano zero. Estou fazendo assim:

public class TestDate {
	public static void main(String[] args) {
		GregorianCalendar gc = new GregorianCalendar(TimeZone.getTimeZone("GMT+00:00"));
		
		System.out.println(gc.get(GregorianCalendar.HOUR_OF_DAY) + ":" + gc.get(GregorianCalendar.MINUTE));
		
		Date greenwhichDate = gc.getTime();
		
		System.out.println(greenwhichDate);
	}
}

E estou obtendo:

16:53
Thu Dec 16 14:53:07 BRST 2004

Quando, na minha máquina, são 14:53 mesmo. Na primeira linha o resultado é extamente o que eu quero, apesar de a gente estar em GMT-3 dá só duas horas de diferença por causa do horário de verão, mas o Date que eu imprimi usando gc.getTime() está apresentado o horário local. Ele não deveria representar o horário no GMT+0 também?

É esse mesmo o jeito certo de se obter um objeto Date que represente o horário de um fuso diferente?[/quote]

Aham, o objeto java.util.Date não guarda a informação de fuso horário dentro dele; ele tenta (pelo menos tenta, ele depende do que obteve do sistema operacional) guardar sempre como UTC. É na hora de imprimir que o toString() pega o fuso horário default e imprime (por exemplo, na sua máquina, como BRST = Brazil SummerTime)

Entendi. :smiley:

Então não dá pra eu fazer nada na apliacação que eu estou desenvolvendo mesmo. Eu queria passar em UTC, mas dando um new Date() eu já faço isso então.

O pau deve estar no outro cliente ou no banco (a minha aplicação grava a data no BD e aparece errado num outro cliente que não fui eu que fiz).

Valeu!!! Brigadão e abraço!

Só para você entender o que é que dá para fazer, aqui está um exemplo.

import java.util.*;
import java.text.*;

class Test186 {
	public static void main(String[] args) {
		DateFormat df = new SimpleDateFormat ("yyyy.MM.dd G 'at' HH:mm:ss z");
		df.setTimeZone (TimeZone.getTimeZone("GMT+00:00"));
		System.out.println (df.format (new Date()));
	}
}

Ele imprime:

2004.12.16 AD at 19:47:50 GMT+00:00

(agora são 17:47)

Aaah, saquei.

Valeu! :slight_smile:

Tente usando as funções abaixo:

public Date getDataFromGMT_00(Date data) {

    int fuso = TimeZone.getDefault().getRawOffset() / 3600000;
    return ajustaFusoData(data, -1 * fuso);

}


public Date ajustaFusoData(Date data, int fuso) {
    try {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(data);
        calendar.add(Calendar.HOUR_OF_DAY, fuso);
        return calendar.getTime();

    } catch (Exception ex) {
        ex.printStackTrace();
        return null;
    }
}

Voce passa a uma data e ele converte para o GMT já usando como base o fuso horário da sua máquina. Portanto funciona em qualquer lugar.

[]s