Mysql
 sql >> Database >  >> RDS >> Mysql

Come convertire epoch in mySQL timestamp in JAVA

java.time

Con il rilascio di Java SE 8 a marzo 2014, l'API Date-Time legacy obsoleta e soggetta a errori (java.util Tipi di data-ora e relativo tipo di formattazione, SimpleDateFormat ecc.) è stato soppiantato da java.time , la moderna API Date-Time. La tabella seguente illustra la mappatura dei tipi SQL ANSI con java.time tipi:

ANSI SQL Java SE 8
DATA Data Locale
TEMPO Ora locale
TIMESTAMP LocalDateTime
TEMPO CON FUSO ORARIO OffsetTime
TIMESTAMP CON FUSO ORARIO OffsetDateTime

Nota che ZonedDateTime e Instant non sono supportati da alcun driver JDBC mentre alcuni driver, ad es. PostgreSQL inoltre non supporta OffsetTime / TIME [ WITHOUT TIMEZONE ] . Inoltre, nota che tutti OffsetDateTime le istanze dovranno essere in UTC (con offset 0). Questo perché il backend li memorizza come UTC.

Come si usa in JDBC?

Di seguito è riportato un codice di esempio per inserire il OffsetDateTime corrente in UTC, in columnfoo (che è di TIMESTAMP WITH TIMEZONE tipo):

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

Un Instant rappresenta un punto istantaneo sulla timeline ed è indipendente da un fuso orario, ovvero ha un fuso orario offset di +00:00 ore.

Di seguito è riportato un codice di esempio per recuperare un OffsetDateTime da 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();

Nel caso tu abbia bisogno di convertire un OffsetDateTime in un altro con un offset diverso:

Esistono diversi modi per farlo, ma uso principalmente OffsetDateTime#withOffsetSameInstant , per convertire un OffsetDateTime in un altro con un diverso fuso orario, ad es.

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

Risultato:

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

Alcuni punti relativi al codice sopra indicato:

  1. La Z nell'output c'è il designatore del fuso orario per l'offset di fuso orario zero. Sta per Zulu e specifica il Etc/UTC timezone (che ha l'offset del fuso orario di +00:00 ore).
  2. Il codice converte odt in due istanze di OffsetDateTime - ognuno in un modo diverso. La prima istanza è con un fuso orario fisso di +02:00 ore mentre il secondo è con l'offset del fuso orario della JVM. Tieni presente che lo scostamento del fuso orario di un luogo che osserva DST cambia secondo l'orario estivo/invernale. Pertanto, se un luogo osserva l'ora legale, invece di utilizzare un fuso orario fisso, ad es. +02:00 ore; dovremmo ottenerlo dall'API.
  3. Il fuso orario della mia JVM è Europe/London e attualmente il suo offset è +01:00 ore.

Ulteriori informazioni sulla API data-ora moderna da Traccia:data e ora .