596 Stimmen

Wie kann ich das aktuelle Datum und die Uhrzeit in UTC oder GMT in Java abrufen?

Wenn ich eine neue Date Objekts wird sie mit der aktuellen Zeit initialisiert, aber in der lokalen Zeitzone. Wie kann ich das aktuelle Datum und die Uhrzeit in GMT abrufen?

0 Stimmen

Ich weiß, diese Art von Themen sind völlig über diskutiert, aber ich fand die commons-lang-Paket wirklich behandelt diese gemeinsame Java-Probleme gut. commons.apache.org/lang/api-2.5/org/apache/commons/lang/time Informieren Sie sich über die verschiedenen Pakete, die sie anbieten.

0 Stimmen

Welche Ortszeit wünschen Sie und mit welcher Genauigkeit. Die meisten Zeitzonen sind relativ zur UTC definiert, mit einem festen Offset gemessen in SI Sekunden, aber die Beziehung der GMT, die auf der Sonnenbeobachtung und einer (leicht) variablen Länge der Sekunde basiert, ist komplexer. Die beiden unterscheiden sich um bis zu 0,9 Sekunden.

4 Stimmen

A Date enthält keine Zeitzone, daher ist "aber in der lokalen Zeitzone" nicht korrekt (oder bestenfalls ungenau). Siehe Alles über java.util.Date .

57voto

Antonio Punkte 11529

Eigentlich nicht die Zeit, aber ihre Darstellung könnte geändert werden.

SimpleDateFormat f = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
f.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(f.format(new Date()));

Die Zeit ist an jedem Punkt der Erde gleich, aber unsere Wahrnehmung der Zeit kann je nach Standort unterschiedlich sein.

0 Stimmen

Ja, eine schöne und saubere Lösung. Es beunruhigt mich nur, wenn seine ineffektiv, ein neues Date-Objekt zu erstellen, anstatt nur immer Kalender-Instanz?

0 Stimmen

Er wird von der JVM optimiert und HotSpot führt den effektivsten x86-Code aus, der möglich ist.

0 Stimmen

Richtig, ein Mal, aber viele Präsentationen, je nach Standort.

19voto

moberme Punkte 599

Dies funktioniert, um UTC-Millisekunden in Android zu erhalten.

Calendar c = Calendar.getInstance();
int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);  
Long utcMilliseconds = c.getTimeInMillis() + utcOffset;

7 Stimmen

Müssen Sie nur noch den Offset abziehen?

0 Stimmen

c.add(Calendar.MILLISECOND, (-utcOffset)) um den Kalender mit der Zeitzone utc zu erhalten

0 Stimmen

Calendar.getInstance().apply { timeInMillis -= get(Calendar.ZONE_OFFSET) + get(Calendar.DST_OFFSET) }

18voto

simpatico Punkte 10039

Kalender aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); Dann werden alle Operationen, die mit dem aGMTCalendar-Objekt durchgeführt werden, mit der GMT-Zeitzone durchgeführt und die Sommerzeit oder feste Verschiebungen werden nicht angewendet

Falsch!

Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
aGMTCalendar.getTime(); //or getTimeInMillis()

y

Calendar aNotGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT-2"));aNotGMTCalendar.getTime();

kehren zur gleichen Zeit zurück. Gleiches gilt für

new Date(); //it's not GMT.

17voto

Adam Punkte 2238

Dieser Code gibt die aktuelle Uhrzeit UTC aus.

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class Test
{
    public static void main(final String[] args) throws ParseException
    {
        final SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
        f.setTimeZone(TimeZone.getTimeZone("UTC"));
        System.out.println(f.format(new Date()));
    }
}

Ergebnis

2013-10-26 14:37:48 UTC

10voto

Dana Wilson Punkte 115

Die folgende Aussage scheint nicht korrekt zu sein Antwort von Jon Skeet . Er sagte:

java.util.Date ist immer in UTC. Wie kommen Sie darauf, dass es sich um die lokale Zeit? Ich vermute, dass das Problem darin besteht, dass Sie die Anzeige über eine Instanz von Calendar anzeigt, die die lokale Zeitzone verwendet, oder möglicherweise mit Date.toString() die ebenfalls die lokale Zeitzone verwendet.

Allerdings ist der Code:

System.out.println(new java.util.Date().getHours() + " hours");

gibt die lokalen Stunden an, nicht die GMT (UTC-Stunden), und verwendet keine Calendar und keine SimpleDateFormat überhaupt nicht.

Aus diesem Grund scheint etwas nicht zu stimmen.

Zusammenstellung der Antworten, des Codes:

System.out.println(Calendar.getInstance(TimeZone.getTimeZone("GMT"))
                           .get(Calendar.HOUR_OF_DAY) + " Hours");

zeigt die GMT-Stunden anstelle der lokalen Stunden an - beachten Sie, dass getTime.getHours() fehlt, denn das würde zu einer Date() Objekt, das theoretisch das Datum in GMT speichert, aber die Stunden in der lokalen Zeitzone wiedergibt.

9 Stimmen

Ich hatte diese Antwort vorher noch nicht gesehen, aber wenn Sie die Dokumentation für das veraltete Date.getHours() macht es sehr deutlich: "Der zurückgegebene Wert ist eine Zahl (0 bis 23), die die Stunde innerhalb des Tages darstellt, die den durch dieses Datumsobjekt dargestellten Zeitpunkt enthält oder mit ihm beginnt, wie in der lokalen Zeitzone interpretiert ." (Hervorhebung von mir.) Es ist die getHours() Methode, die den Wert innerhalb der lokalen Zeitzone interpretiert - er ist nicht Teil des Status der Date Objekt selbst.

3 Stimmen

Wie Jon Skeet richtig festgestellt hat, ist ein java.util.Date-Objekt hat keine Zeitzone . Verwirrend ist jedoch, dass die Methoden toString y getHours die Standardzeitzone auf ihre Ausgabe anwenden. Naive Programmierer lassen sich also leicht täuschen, da es scheint ein Datum eine Zeitzone hat, aber in Wirklichkeit keine hat.

0 Stimmen

El getHours() Methode ist seit mehr als 25 Jahren veraltet, weil sie in verschiedenen Zeitzonen unzuverlässig funktioniert. Sie zeigen also nicht, dass Jon Skeet sich geirrt hat (was nicht der Fall war), sondern dass es einen guten Grund für die Verwerfung gab.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X