Calendar.getInstance (TimeZone.getTimeZone ("UTC")) gibt keine UTC-Zeit zurück

106

Ich bin wirklich verwirrt mit dem Ergebnis, das ich mit dem Calendar.getInstance(TimeZone.getTimeZone("UTC"))Methodenaufruf erhalte. Es gibt IST-Zeit zurück.

Hier ist der Code, den ich verwendet habe

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

und die Antwort, die ich bekam, ist:

Sat Jan 25 15:44:18 IST 2014

Also habe ich versucht, die Standard-Zeitzone auf UTC zu ändern, und dann habe ich überprüft, ob sie einwandfrei funktioniert

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

Ergebnis:

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

Vermisse ich hier etwas?

vicky
quelle

Antworten:

146

Der System.out.println(cal_Two.getTime())Aufruf gibt ein Datevon zurück getTime(). Es ist Datedas, für das eine Zeichenfolge konvertiert wird println, und diese Konvertierung verwendet ISTin Ihrem Fall die Standardzeitzone .

Sie müssen explizit verwenden DateFormat.setTimeZone(), um die Datein der gewünschten Zeitzone zu drucken .

EDIT: Mit freundlicher Genehmigung von @Laurynas, beachten Sie Folgendes:

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
quelle
Ich habe für einen Moment danach gesucht. Vielleicht ist der Titel nicht explizit genug? Übrigens, danke für die Hilfe
gavard.e
3
Sie können viel Zeit sparen, wenn Sie das Ergebnis von System.out.println
anzeigen
1
Ich verstehe das .. danke .. Aber ich verstehe nicht, wie das Festlegen einer Zeitzoneneinstellung in der Verantwortung der simpleDateFormat-Klasse liegt. Durch Ändern der Zeitzone wird die tatsächliche Zeit geändert, nicht das Format. SimpleDateFormats Aufgabe ist es, nur das Datum zu formatieren, nicht die Uhrzeit zu manipulieren ...
AngryITguy
Perfekte Antwort !!
Najib Ahmed Puthawala
Dies (ich muss die Zeitzone des Formatierers einstellen) bringt mich jedes Mal, obwohl ich die Zeitzone des Kalenders einstelle.
Agi Hammerthief
17

java.util.Dateist unabhängig von der Zeitzone. Wenn Sie drucken, cal_Twoobwohl für die CalendarInstanz die Zeitzone eingestellt ist, UTCwird cal_Two.getTime()eine DateInstanz zurückgegeben, die keine Zeitzone hat (und immer in der Standardzeitzone liegt).

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

Ausgabe:

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

Aus dem Javadoc von TimeZone.setDefault()

Legt die Zeitzone fest, die von der Methode getDefault zurückgegeben wird. Wenn zone null ist, setzen Sie den Standardwert auf den Wert zurück, den er ursprünglich beim ersten Start der VM hatte.

Somit bewegen Sie setDefault()vor cal_Twoinstanziiert würden Sie das richtige Ergebnis bekommen.

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

Ausgabe:

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

arbeitet für mich

Fabian
quelle
5

Sie vermissen definitiv eine kleine Sache und das heißt, Sie setzen keinen Standardwert:

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

Der Code würde also so aussehen:

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

Erläuterung : Wenn Sie die Zeitzone ändern möchten, legen Sie die Standardzeitzone mit festTimeZone.setDefault()

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

       }

Wenn Sie die Liste der Zeitzonen anzeigen möchten, finden Sie hier den folgenden Code

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

Versuchen Sie es GMTanstelle von UTC. Sie beziehen sich auf dieselbe Zeitzone, der Name GMTist jedoch häufiger und funktioniert möglicherweise.

Poitroae
quelle
Die Verwendung von GMT führt zu denselben Ergebnissen.
Jim