Calendar.getInstance (TimeZone.getTimeZone ("UTC")) non restituisce l'ora UTC


106

Sono davvero confuso con il risultato che sto ottenendo con la Calendar.getInstance(TimeZone.getTimeZone("UTC"))chiamata al metodo, sta tornando il tempo IST.

Ecco il codice che ho usato

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

e la risposta che ho ricevuto è:

Sat Jan 25 15:44:18 IST 2014

Quindi ho provato a cambiare il fuso orario predefinito in UTC e poi ho controllato, quindi funziona bene

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

Risultato:

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

Mi manca qualcosa qui?

Risposte:


146

L' System.out.println(cal_Two.getTime())invocazione restituisce un Datefrom getTime(). È il per Datecui viene convertito in una stringa printlne quella conversione utilizzerà il ISTfuso orario predefinito nel tuo caso.

Dovrai utilizzare esplicitamente DateFormat.setTimeZone()per stampare il Datenel fuso orario desiderato.

EDIT: per gentile concessione di @Laurynas, considera questo:

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

Lo stavo cercando da un momento. Forse il titolo non è abbastanza esplicito? A proposito, grazie per l'aiuto
gavard.e

3
Puoi risparmiare molto tempo se mostri il risultato di System.out.println :)
Vasil Valchev

1
Ho capito .. grazie .. Ma non capisco come l'impostazione di un fuso orario sia responsabilità della classe simpleDateFormat. La modifica del fuso orario cambia l'ora effettiva, non il suo formato. Il compito di SimpleDateFormat è semplicemente formattare la data, non manipolare l'ora ...
angryITguy

Risposta perfetta !!
Najib Ahmed Puthawala

Questo (dover impostare il fuso orario del formattatore) mi ottiene ogni volta, anche se ho impostato il fuso orario del calendario.
Agi Hammerthief,

17

java.util.Dateè indipendente dal fuso orario. Quando stampi cal_Twosebbene l' Calendaristanza abbia il fuso orario impostato su UTC, cal_Two.getTime()restituirà Dateun'istanza che non ha un fuso orario (ed è sempre nel fuso orario predefinito)

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

Produzione:

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

Dal javadoc di TimeZone.setDefault()

Imposta il TimeZone restituito dal metodo getDefault. Se la zona è nulla, reimposta il valore predefinito al valore che aveva originariamente al primo avvio della VM.

Quindi, spostando il tuo setDefault()prima cal_Twoè istanziato, otterrai il risultato corretto.

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

Produzione:

Sat Jan 25 11:15:29 UTC 2014
Sat Jan 25 11:15:29 UTC 2014

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

sta lavorando per me


5

Ti manca decisamente una piccola cosa e cioè non stai impostando un valore predefinito:

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

Quindi il codice sarebbe simile a:

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

Spiegazione : se si desidera modificare il fuso orario, impostare il fuso orario predefinito utilizzandoTimeZone.setDefault()


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 vuoi vedere la lista dei fusi orari, ecco il seguente codice

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;

}

-6

Prova a usare GMTinvece di UTC. Si riferiscono allo stesso fuso orario, ma il nome GMTè più comune e potrebbe funzionare.


L'utilizzo del GMT produrrà gli stessi risultati.
Jim
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.