Calendar.getInstance (TimeZone.getTimeZone (“UTC”)) não está retornando a hora UTC

106

Estou realmente confuso com o resultado que estou obtendo com a Calendar.getInstance(TimeZone.getTimeZone("UTC"))chamada de método, é o tempo de retorno IST.

Aqui está o código que usei

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

e a resposta que recebi foi:

Sat Jan 25 15:44:18 IST 2014

Tentei mudar o fuso horário padrão para UTC e depois verifiquei, está funcionando bem

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

TimeZone tz  = TimeZone.getDefault() ;
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Three = Calendar.getInstance();
System.out.println(cal_Three.getTime());
TimeZone.setDefault(tz);

Resultado:

Sat Jan 25 16:09:11 IST 2014
Sat Jan 25 10:39:11 UTC 2014

Estou faltando alguma coisa aqui?

vicky
fonte

Respostas:

146

A System.out.println(cal_Two.getTime())invocação retorna um Datefrom getTime(). É o Dateque está sendo convertido em uma string para println, e essa conversão usará o ISTfuso horário padrão no seu caso.

Você precisará usar explicitamente DateFormat.setTimeZone()para imprimir o Dateno fuso horário desejado.

EDIT: Cortesia de @Laurynas, considere o seguinte:

TimeZone timeZone = TimeZone.getTimeZone("UTC");
Calendar calendar = Calendar.getInstance(timeZone);
SimpleDateFormat simpleDateFormat = 
       new SimpleDateFormat("EE MMM dd HH:mm:ss zzz yyyy", Locale.US);
simpleDateFormat.setTimeZone(timeZone);

System.out.println("Time zone: " + timeZone.getID());
System.out.println("default time zone: " + TimeZone.getDefault().getID());
System.out.println();

System.out.println("UTC:     " + simpleDateFormat.format(calendar.getTime()));
System.out.println("Default: " + calendar.getTime());
interface simulada
fonte
Estou procurando por isso há um momento. Talvez o título não seja suficientemente explícito? A propósito, obrigado pela ajuda
gavard.e
3
Você pode economizar muito tempo se mostrar o resultado de System.out.println :)
Vasil Valchev
1
Eu entendo .. obrigado .. Mas eu não entendo como definir uma configuração de fuso horário seria responsabilidade da classe simpleDateFormat. Alterar o fuso horário altera a hora real, não seu formato. O trabalho de SimpleDateFormat é apenas formatar a data, não manipular o tempo ....
angryITguy
Resposta perfeita !!
Najib Ahmed Puthawala
Isso (ter que definir o fuso horário do formatador) me afeta todas as vezes, embora eu defina o fuso horário do calendário.
Agi Hammerthief
17

java.util.Dateé independente do fuso horário. Quando você imprime, cal_Twoembora a Calendarinstância tenha seu fuso horário definido como UTC, cal_Two.getTime()retornaria uma Dateinstância que não tem um fuso horário (e está sempre no fuso horário padrão)

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());
System.out.println(cal_Two.getTimeZone());

Resultado:

 Sat Jan 25 16:40:28 IST 2014
    sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null] 

Do Javadoc de TimeZone.setDefault()

Define o TimeZone que é retornado pelo método getDefault. Se a zona for nula, redefina o padrão para o valor que tinha originalmente quando a VM foi iniciada pela primeira vez.

Portanto, movendo seu setDefault()antes cal_Twoé instanciado você obteria o resultado correto.

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

Calendar cal_Three = Calendar.getInstance();
System.out.println(cal_Three.getTime());

Resultado:

Sat Jan 25 11:15:29 UTC 2014
Sat Jan 25 11:15:29 UTC 2014
PopoFibo
fonte
6
Calendar currentTime = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
currentTime.set(Calendar.ZONE_OFFSET, TimeZone.getTimeZone("UTC").getRawOffset());
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, currentTime.get(Calendar.HOUR_OF_DAY));
calendar.getTimeInMillis()

está trabalhando para mim

Fabian
fonte
5

Definitivamente, você está perdendo uma pequena coisa: não está definindo um valor padrão:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

Portanto, o código ficaria assim:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

Explicação : Se você deseja alterar o fuso horário, defina o fuso horário padrão usandoTimeZone.setDefault()

Monika V
fonte
0
    Following code is the simple example to change the timezone
public static void main(String[] args) {
          //get time zone
          TimeZone timeZone1 = TimeZone.getTimeZone("Asia/Colombo");
          Calendar calendar = new GregorianCalendar();
          //setting required timeZone
          calendar.setTimeZone(timeZone1);
          System.out.println("Time :" + calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE)+":"+calendar.get(Calendar.SECOND));

       }

se você quiser ver a lista de fusos horários, aqui está o código a seguir

public static void main(String[] args) {

    String[] ids = TimeZone.getAvailableIDs();
    for (String id : ids) {
        System.out.println(displayTimeZone(TimeZone.getTimeZone(id)));
    }

    System.out.println("\nTotal TimeZone ID " + ids.length);

}

private static String displayTimeZone(TimeZone tz) {

    long hours = TimeUnit.MILLISECONDS.toHours(tz.getRawOffset());
    long minutes = TimeUnit.MILLISECONDS.toMinutes(tz.getRawOffset())
                              - TimeUnit.HOURS.toMinutes(hours);
    // avoid -4:-30 issue
    minutes = Math.abs(minutes);

    String result = "";
    if (hours > 0) {
        result = String.format("(GMT+%d:%02d) %s", hours, minutes, tz.getID());
    } else {
        result = String.format("(GMT%d:%02d) %s", hours, minutes, tz.getID());
    }

    return result;

}
Khalid Habib
fonte
-6

Tente usar em GMTvez de UTC. Eles se referem ao mesmo fuso horário, mas o nome GMTé mais comum e pode funcionar.

poitroae
fonte
Usar GMT produzirá os mesmos resultados.
Jim,