Calendar.getInstance (TimeZone.getTimeZone («UTC»)) ne renvoie pas l'heure UTC

106

Je suis vraiment confus avec le résultat que j'obtiens avec l' Calendar.getInstance(TimeZone.getTimeZone("UTC"))appel de méthode, il renvoie l'heure IST.

Voici le code que j'ai utilisé

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

et la réponse que j'ai obtenue est:

Sat Jan 25 15:44:18 IST 2014

J'ai donc essayé de changer le fuseau horaire par défaut en UTC, puis j'ai vérifié, alors cela fonctionne 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);

Résultat:

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

Est-ce que j'ai râté quelque chose?

Vicky
la source

Réponses:

146

L' System.out.println(cal_Two.getTime())appel renvoie un Datefrom getTime(). C'est le Datequi est converti en une chaîne pour println, et cette conversion utilisera le ISTfuseau horaire par défaut dans votre cas.

Vous devrez utiliser explicitement DateFormat.setTimeZone()pour imprimer le Datedans le fuseau horaire souhaité.

EDIT: Gracieuseté de @Laurynas, considérez ceci:

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());
mockinterface
la source
Je cherchais ça depuis un moment. Peut-être que le titre n'est pas assez explicite? Au fait, merci pour l'aide
gavard.e
3
Vous pouvez économiser beaucoup de temps si vous affichez le résultat de System.out.println :)
Vasil Valchev
1
Je comprends cela .. merci .. Mais je ne comprends pas comment définir un paramètre de fuseau horaire serait la responsabilité de la classe simpleDateFormat. Changer le fuseau horaire change l'heure réelle, pas son format. Le travail de SimpleDateFormat consiste simplement à formater la date, pas à manipuler l'heure ....
angryITguy
Réponse parfaite !!
Najib Ahmed Puthawala
Cela (avoir à définir le fuseau horaire du formateur) me procure à chaque fois, même si j'ai défini le fuseau horaire du calendrier.
Agi Hammerthief
17

java.util.Dateest indépendant du fuseau horaire. Lorsque vous imprimez cal_Twoalors que l' Calendarinstance a son fuseau horaire défini sur UTC, cal_Two.getTime()renvoie une Dateinstance qui n'a pas de fuseau horaire (et est toujours dans le fuseau horaire par défaut)

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

Production:

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

Du javadoc de TimeZone.setDefault()

Définit le TimeZone renvoyé par la méthode getDefault. Si la zone est nulle, réinitialisez la valeur par défaut à la valeur qu'elle avait initialement lors du premier démarrage de la machine virtuelle.

Par conséquent, en déplaçant votre setDefault()avant cal_Twoest instancié, vous obtiendrez le résultat correct.

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

Production:

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

travaille pour moi

Fabien
la source
5

Il vous manque définitivement une petite chose et c'est que vous ne définissez pas de valeur par défaut:

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

Donc, le code ressemblerait à:

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

Explication : Si vous souhaitez modifier le fuseau horaire, définissez le fuseau horaire par défaut à l'aide deTimeZone.setDefault()

Monika V
la source
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 vous voulez voir la liste des fuseaux horaires, voici le code suivant

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
la source
-6

Essayez d'utiliser à la GMTplace de UTC. Ils font référence au même fuseau horaire, mais le nom GMTest plus courant et pourrait fonctionner.

poitroae
la source
L'utilisation de GMT produira les mêmes résultats.
Jim