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 .

523voto

Basil Bourque Punkte 256611

Tl;dr

Instant.now()   // Capture the current moment in UTC. 

Erzeugen Sie einen String, der diesen Wert darstellt:

Instant.now().toString()  

2016-09-13T23:30:52.123Z

Einzelheiten

Als die richtige Antwort von Jon Skeet angegeben, hat ein java.util.Date-Objekt keine Zeitzone † . Aber seine toString Implementierung wendet die Standardzeitzone der JVM an, wenn sie die String-Darstellung dieses Datum-Zeit-Wertes erzeugt. Verwirrend für den unbedarften Programmierer ist, dass ein Date scheint eine Zeitzone haben sollte, dies aber nicht tut.

Le site java.util.Date , j.u.Calendar y java.text.SimpleDateFormat Klassen, die mit Java gebündelt werden, sind notorisch problematisch. Vermeiden Sie sie. Verwenden Sie stattdessen eine dieser kompetenten Datum-Zeit-Bibliotheken:

java.time (Java 8)

Java 8 bringt eine hervorragende neue java.time.* Paket um die alten java.util.Date/Calendar-Klassen abzulösen.

Die aktuelle Zeit in UTC/GMT zu ermitteln ist ein einfacher Einzeiler

Instant instant = Instant.now();

Das Instant Klasse ist der grundlegende Baustein in java.time, der einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden .

In Java 8 wird der aktuelle Moment nur mit einer Auflösung von bis zu Millisekunden erfasst. Java 9 bringt eine neue Implementierung de Clock erfasst den aktuellen Zeitpunkt bis zur vollen Nanosekunden-Fähigkeit dieser Klasse, abhängig von der Fähigkeit der Uhrenhardware Ihres Host-Computers.

Es ist toString Methode erzeugt eine String-Darstellung ihres Wertes mit ein bestimmtes ISO 8601-Format . Dieses Format gibt null, drei, sechs oder neun Ziffern aus ( Millisekunden , Mikrosekunden , oder Nanosekunden ), die zur Darstellung des Sekundenbruchteils erforderlich sind.

Wenn Sie eine flexiblere Formatierung oder andere zusätzliche Funktionen wünschen, dann wenden Sie für UTC selbst einen Offset von Null an ( ZoneOffset.UTC Konstante ), um eine OffsetDateTime .

OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );

Dump zur Konsole

System.out.println( "now.toString(): " + now );

Wenn es läuft

now.toString(): 2014-01-21T23:42:03.522Z

Table of date-time types in Java, both modern and legacy.


Über java.time

Le site java.time Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Erbe Datum-Zeit-Klassen wie java.util.Date , Calendar , & SimpleDateFormat .

Weitere Informationen finden Sie in der Oracle-Tutorial . Und suchen Sie auf Stack Overflow nach vielen Beispielen und Erklärungen. Spezifikation ist JSR 310 .

Le site Joda-Time Projekt, jetzt in Wartungsmodus rät zur Migration auf den java.time Klassen.

Sie können umtauschen java.time Objekte direkt mit Ihrer Datenbank. Verwenden Sie eine JDBC-Treiber übereinstimmend mit JDBC 4.2 oder später. Keine Notwendigkeit für Strings, keine Notwendigkeit für java.sql.* Klassen.

Wo erhält man die java.time-Klassen?

Table of which java.time library to use with which version of Java or Android

Le site DreiZehn-Extra Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt dient als Versuchsfeld für mögliche zukünftige Erweiterungen von java.time. Sie finden hier vielleicht einige nützliche Klassen wie Interval , YearWeek , YearQuarter y mehr .


Joda-Time

UPDATE: Die Joda-Time Projekt, jetzt in Wartungsmodus rät zur Migration auf den java.time Klassen.

Die Verwendung des Joda-Time Mit der kostenlosen Open-Source-Bibliothek eines Drittanbieters können Sie die aktuelle Datumszeit in nur einer Zeile Code ermitteln.

Joda-Time inspirierte die neuen java.time.*-Klassen in Java 8, hat aber eine andere Architektur. Sie können Joda-Time in älteren Versionen von Java verwenden. Joda-Time funktioniert weiterhin in Java 8 und wird weiterhin aktiv gepflegt (Stand 2014). Das Joda-Time-Team rät jedoch zur Migration auf java.time.

System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );

Ausführlicherer Beispielcode (Joda-Time 2.3)

org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );

Dump zur Konsole

System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );

Wenn es läuft

Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z

Für weiteren Beispielcode für die Arbeit mit Zeitzonen, siehe meine Antwort auf eine ähnliche Frage.

Zeitzone

Ich empfehle Ihnen, immer eine Zeitzone anzugeben, anstatt sich implizit auf die aktuelle Standardzeitzone der JVM zu verlassen (die sich jederzeit ändern kann!). Solches Vertrauen scheint eine häufige Ursache für Verwirrung und Fehler in der Datums-Zeit-Arbeit zu sein.

Bei einem Anruf now() geben Sie die gewünschte/erwartete Zeitzone an, die zugewiesen werden soll. Verwenden Sie die DateTimeZone Klasse.

DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );

Diese Klasse enthält eine Konstante für UTC Zeitzone.

DateTime now = DateTime.now( DateTimeZone.UTC );

Wenn Sie wirklich die aktuelle Standardzeitzone der JVM verwenden wollen, machen Sie einen expliziten Aufruf, damit Ihr Code selbstdokumentierend ist.

DateTimeZone zoneDefault = DateTimeZone.getDefault();

ISO 8601

Lesen Sie über ISO 8601 Formate. Sowohl java.time als auch Joda-Time verwenden die sinnvollen Formate dieses Standards als Standard für das Parsen und Erzeugen von Zeichenketten.


† Eigentlich ist java.util.Date tut haben eine Zeitzone, die tief unter Schichten von Quellcode vergraben ist. Für die meisten praktischen Zwecke wird diese Zeitzone ignoriert. Als Abkürzung sagen wir also, dass java.util.Date keine Zeitzone hat. Außerdem ist diese vergrabene Zeitzone pas das von Date's verwendete toString Methode; diese Methode verwendet die aktuelle Standardzeitzone der JVM. Ein Grund mehr, diese verwirrende Klasse zu vermeiden und sich an Joda-Time und java.time.

4 Stimmen

DateTime.now().toDateTime(DateTimeZone.UTC) war das, wonach ich gesucht habe! Danke!

3 Stimmen

@Managarm Sie können das abkürzen auf: DateTime nowUtc = DateTime.now ( DateTimeZone.UTC ) ;

0 Stimmen

Wie man dies mit Pure Java 8 erreicht 2014-01-21T15:34:29.933-08:00 in dem von Ihnen verwendeten Beispiel new org.joda.time.DateTime()

443voto

Jon Skeet Punkte 1325502

java.util.Date hat keine spezifische Zeitzone, obwohl sein Wert meist in Bezug auf UTC betrachtet wird. Wie kommen Sie darauf, dass es sich um die Ortszeit handelt?

Um genau zu sein: der Wert innerhalb einer java.util.Date ist die Anzahl der Millisekunden seit der Unix-Epoche, die um Mitternacht des 1. Januar 1970, UTC, stattfand. Die gleiche Epoche könnte auch in anderen Zeitzonen beschrieben werden, aber die traditionelle Beschreibung ist in UTC. Da es sich um eine Zahl von Millisekunden seit einer festen Epoche handelt, ist der Wert in java.util.Date ist zu jedem Zeitpunkt auf der ganzen Welt gleich, unabhängig von der lokalen Zeitzone.

Ich vermute, das Problem ist, dass Sie es über eine Instanz von Calendar anzeigen, die die lokale Zeitzone verwendet, oder möglicherweise mit Date.toString() die ebenfalls die lokale Zeitzone verwendet, oder eine SimpleDateFormat Instanz, die standardmäßig auch die lokale Zeitzone verwendet.

Wenn dies nicht das Problem ist, senden Sie bitte einen Beispielcode.

Ich würde jedoch empfehlen, dass Sie Joda-Time die eine viel klarere API bietet.

2 Stimmen

Ich habe ein neues Date()-Objekt verwendet und in eine DB-Tabelle eingefügt. DB ist MySQL und wenn ich UTC_TIMESTAMP() Funktion in MySQL verwenden, es funktioniert richtig, aber wenn ich den Wert eines neuen Date() einfügen, ist es in meiner lokalen Zeitzone eingefügt.

6 Stimmen

Dann ist das wahrscheinlich ein Treiberproblem. Vielleicht müssen Sie Ihre Verbindung auf UTC oder etwas Ähnliches einstellen. Ich habe solche Probleme schon gesehen, aber das Problem liegt nicht in java.util.Date.

0 Stimmen

Danke! Sie haben recht. Ich habe mir die Verbindungseigenschaften von mysql angesehen, aber ich konnte die richtige Konfiguration nicht finden. Ich habe eine andere Frage gestellt: Wie speichert man ein java.util.Date in einem MySQL-Zeitstempelfeld in der Zeitzone UTC/GMT? Wenn Sie können, helfen Sie mir bitte.

285voto

Dan Punkte 2817
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));

//Local time zone   
SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");

//Time in GMT
return dateFormatLocal.parse( dateFormatGmt.format(new Date()) );

11 Stimmen

Warum parsen Sie mit dateFormatLocal nach der Verwendung von dateFormatGmt Format... macht keinen Sinn durch das Lesen es. Ich bin sicher, es funktioniert, aber nur wundern?

2 Stimmen

SetTimeZone hat es geschafft (ich schätze, man kann auch getTimeZone("UTC") verwenden, was dasselbe ist wie GMT?)

6 Stimmen

Aber die Zeit ist abhängig von der eingestellten Gerätezeit. Wenn der Benutzer eine falsche Zeit auf seinem Gerät eingestellt hat, erhalten Sie eine falsche UTC.

91voto

Someone Somewhere Punkte 22958

Dies liefert definitiv die UTC-Zeit: als String- und Date-Objekte!

static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

public static Date getUTCdatetimeAsDate() {
    // note: doesn't check for null
    return stringDateToDate(getUTCdatetimeAsString());
}

public static String getUTCdatetimeAsString() {
    final SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
    final String utcTime = sdf.format(new Date());

    return utcTime;
}

public static Date stringDateToDate(String StrDate) {
    Date dateToReturn = null;
    SimpleDateFormat dateFormat = new SimpleDateFormat(DATEFORMAT);

    try {
        dateToReturn = (Date)dateFormat.parse(StrDate);
    }
    catch (ParseException e) {
        e.printStackTrace();
    }

    return dateToReturn;
}

0 Stimmen

In meiner Antwort habe ich vergessen zu zeigen, wie DATEFORMAT definiert ist: static final String DATEFORMAT = "yyyy-MM-dd HH:mm:ss";

21 Stimmen

Bitte vermeiden Sie es, Methodennamen in Java mit Großbuchstaben zu beginnen. Siehe die Java-Codierungskonventionen für Methodennamen.

2 Stimmen

Ich werde zu dieser Antwort weitergeleitet, indem ich anrufe new Date() wird niemals die richtige UTC-Zeit zurückgeben, wenn die Gerätezeit falsch ist.

68voto

Ahmad Nadeem Punkte 1867
    Calendar c = Calendar.getInstance();
    System.out.println("current: "+c.getTime());

    TimeZone z = c.getTimeZone();
    int offset = z.getRawOffset();
    if(z.inDaylightTime(new Date())){
        offset = offset + z.getDSTSavings();
    }
    int offsetHrs = offset / 1000 / 60 / 60;
    int offsetMins = offset / 1000 / 60 % 60;

    System.out.println("offset: " + offsetHrs);
    System.out.println("offset: " + offsetMins);

    c.add(Calendar.HOUR_OF_DAY, (-offsetHrs));
    c.add(Calendar.MINUTE, (-offsetMins));

    System.out.println("GMT Time: "+c.getTime());

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