So konvertieren Sie Epochen in MySQL-Zeitstempel in JAVA

Lesezeit: 3 Minuten

So konvertieren Sie Epochen in MySQL Zeitstempel in JAVA
Szymon Toda

So erhalten Sie das mySQL-Zeitstempelformat mySQLtimestamp?

long epochNow = System.currentTimeMillis()/1000;
long epochWeek = 604800;
long date7daysAgo = epochNo2013 w - epochWeek;
String mySQLtimestamp = /* 2013-09-23:50:00 */ 

1647264428 787 So konvertieren Sie Epochen in MySQL Zeitstempel in JAVA
Arvind Kumar Avinash

java.time

Mit der Veröffentlichung von Java SE 8 im März 2014 wurde die veraltete und fehleranfällige veraltete Date-Time-API (java.util Date-Time-Typen und deren Formatierungstyp, SimpleDateFormat usw.) wurde ersetzt durch java.timedie moderne Date-Time-API*. Die Folgende Tabelle zeigt die Zuordnung von ANSI-SQL-Typen mit java.time Typen:

ANSI-SQL Java SE 8
DATUM Lokales Datum
ZEIT Ortszeit
ZEITSTEMPEL LocalDateTime
ZEIT MIT ZEITZONE OffsetZeit
ZEITSTEMPEL MIT ZEITZONE OffsetDateTime

Beachten Sie, dass ZonedDateTime und Instant werden von keinem JDBC-Treiber unterstützt, während einige Treiber, z. B. PostgreSQL, ebenfalls keine Unterstützung bieten OffsetTime / TIME [ WITHOUT TIMEZONE ]. Beachten Sie auch, dass alle OffsetDateTime Instanzen müssen in UTC sein (Offset 0 haben). Dies liegt daran, dass das Backend sie als UTC speichert.

Wie benutzt man es in JDBC?

Unten ist ein Beispielcode zum Einfügen des Stroms OffsetDateTime in UTC, in columnfoo (das ist von TIMESTAMP WITH TIMEZONE Art):

OffsetDateTime odt = Instant.now().atOffset(ZoneOffset.UTC);
PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1, odt);
st.executeUpdate();
st.close();

Ein Instant stellt einen momentanen Punkt auf der Zeitachse dar und ist unabhängig von einer Zeitzone, dh es hat einen Zeitzonen-Offset von +00:00 Std.

Unten ist ein Beispielcode zum Abrufen von a OffsetDateTime von columnfoo:

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE <some condition>");
while (rs.next()) {
    // Assuming the column index of columnfoo is 1
    OffsetDateTime odt = rs.getObject(1, OffsetDateTime.class));
    System.out.println(odt);
}
rs.close();
st.close();

Nur für den Fall, dass Sie eine konvertieren müssen OffsetDateTime in einen anderen mit einem anderen Offset:

Es gibt mehrere Möglichkeiten, dies zu tun, aber ich verwende meistens OffsetDateTime#withOffsetSameInstantum ein zu konvertieren OffsetDateTime in einen anderen mit einem anderen Zeitzonen-Offset, z

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        // A sample OffsetDateTime in UTC.
        OffsetDateTime odt = Instant.now().atOffset(ZoneOffset.UTC);
        System.out.println(odt);

        OffsetDateTime offsetTimeAtOffset0100 = odt.withOffsetSameInstant(ZoneOffset.of("+02:00"));
        System.out.println(offsetTimeAtOffset0100);

        // Time at JVM's default timezone offset
        ZoneOffset jvmTzOffset = ZonedDateTime.now(ZoneId.systemDefault()).getOffset();
        OffsetDateTime offsetTimeAtJvmTzOffset = odt.withOffsetSameInstant(jvmTzOffset);
        System.out.println(offsetTimeAtJvmTzOffset);
    }
}

Ausgabe:

2021-05-29T13:36:15.258076Z
2021-05-29T15:36:15.258076+02:00
2021-05-29T14:36:15.258076+01:00

Einige Punkte im Zusammenhang mit dem oben angegebenen Code:

  1. Die Z in der ausgabe ist die Zeitzonenbezeichner für Null-Zeitzonen-Offset. Es steht für Zulu und spezifiziert die Etc/UTC timezone (mit dem Zeitzonen-Offset von +00:00 Std).
  2. Der Code konvertiert odt in zwei Instanzen von OffsetDateTime – jeder anders. Die erste Instanz ist mit einem festen Zeitzonen-Offset von +02:00 Stunden, während die zweite mit dem Zeitzonen-Offset der JVM ist. Beachten Sie, dass der Zeitzonen-Offset eines Ortes beobachtet wird Sommerzeit Änderungen je nach Sommer-/Winterzeit. Wenn also an einem Ort die Sommerzeit eingehalten wird, anstatt einen festen Zeitzonen-Offset zu verwenden, z +02:00 Std; wir sollten es von der API bekommen.
  3. Die Zeitzone meiner JVM ist Europe/London und derzeit ist sein Offset +01:00 Std.

Erfahren Sie mehr über die moderne Datum-Uhrzeit-API* von Spur: Datum Uhrzeit.


* Wenn Sie sich aus irgendeinem Grund an Java 6 oder Java 7 halten müssen, können Sie verwenden ThreeTen-Backport die die meisten zurückportiert java.time Funktionalität auf Java 6 & 7. Wenn Sie für ein Android-Projekt arbeiten und Ihr Android-API-Level immer noch nicht mit Java-8 kompatibel ist, überprüfen Sie dies Java 8+ APIs verfügbar durch Desugaring und How to use ThreeTenABP in Android Project.

So konvertieren Sie Epochen in MySQL Zeitstempel in JAVA
Jürgen D

Warum nicht eine normale verwenden Date die ganze Zeit?

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, -7);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
String output = formatter.format(cal.getTime());

  • Gewünschte Ausgabe ist (String) "29-09-2013 23:50:00"

    – Szymon Toda

    29. September 2013 um 16:59 Uhr

  • @Ultra: Ich habe die Antwort geändert. Das Standard-SQL-Datetime-Format ist jedoch 2013-09-29 23:50:00.

    – Jürgen D

    29. September 2013 um 17:05 Uhr


  • Sie haben Recht, aber Ihre Lösung kehrt am falschen Tag zurück: 265-09-2013 19:07:16 aber es ist einfach, mit neu zu formatieren SimpleDateFormat("yyyy-MM-dd HH:mm:ss")

    – Szymon Toda

    29. September 2013 um 17:08 Uhr


1001720cookie-checkSo konvertieren Sie Epochen in MySQL-Zeitstempel in JAVA

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy