Calendar.getInstance (TimeZone.getTimeZone ("UTC")) no devuelve la hora UTC

106

Estoy realmente confundido con el resultado que obtengo con la Calendar.getInstance(TimeZone.getTimeZone("UTC"))llamada al método, está devolviendo la hora IST.

Aquí está el código que usé

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

y la respuesta que obtuve es:

Sat Jan 25 15:44:18 IST 2014

Así que intenté cambiar la zona horaria predeterminada a UTC y luego verifiqué, entonces está funcionando bien

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

¿Me estoy perdiendo de algo?

vicky
fuente

Respuestas:

146

La System.out.println(cal_Two.getTime())invocación devuelve un Datede getTime(). Es el Dateque se está convirtiendo en una cadena println, y esa conversión utilizará la ISTzona horaria predeterminada en su caso.

Deberá usar explícitamente DateFormat.setTimeZone()para imprimir el Dateen la zona horaria deseada.

EDITAR: Cortesía de @Laurynas, considere esto:

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());
interfaz simulada
fuente
He estado buscando esto por un momento. ¿Quizás el título no es lo suficientemente explícito? Por cierto, gracias por la ayuda
gavard.e
3
Puede ahorrar mucho tiempo si muestra el resultado de System.out.println :)
Vasil Valchev
1
Entiendo esto ... gracias ... Pero no entiendo cómo la configuración de una zona horaria sería responsabilidad de la clase simpleDateFormat. Cambiar la zona horaria cambia la hora real, no su formato. El trabajo de SimpleDateFormat es simplemente formatear la fecha, no manipular la hora ....
angryITguy
Respuesta perfecta !!
Najib Ahmed Puthawala
Esto (tener que configurar la zona horaria del formateador) me atrapa cada vez, aunque configuré la zona horaria del calendario.
Agi Hammerthief
17

java.util.Datees independiente de la zona horaria. Cuando imprime, cal_Twoaunque la Calendarinstancia tiene su zona horaria configurada UTC, cal_Two.getTime()devolvería una Dateinstancia que no tiene una zona horaria (y siempre está en la zona horaria predeterminada)

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

Salida:

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

Desde el javadoc de TimeZone.setDefault()

Establece la zona horaria que devuelve el método getDefault. Si la zona es nula, restablezca el valor predeterminado al valor que tenía originalmente cuando se inició la VM.

Por lo tanto, si mueve su setDefault()antes cal_Two, obtendría el resultado correcto.

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());

Salida:

Sat Jan 25 11:15:29 UTC 2014
Sat Jan 25 11:15:29 UTC 2014
PopoFibo
fuente
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()

esta trabajando para mi

Fabian
fuente
5

Definitivamente te falta una pequeña cosa y es que no estás estableciendo un valor predeterminado:

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

Entonces el código se vería así:

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

Explicación : Si desea cambiar la zona horaria, establezca la zona horaria predeterminada utilizandoTimeZone.setDefault()

Monika V
fuente
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));

       }

si desea ver la lista de zonas horarias, aquí está el siguiente código

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
fuente
-6

Intente usar en GMTlugar de UTC. Se refieren a la misma zona horaria, pero el nombre GMTes más común y podría funcionar.

poitroae
fuente
El uso de GMT producirá los mismos resultados.
Jim