Sospensione con Java 8 LocalDate & LocalDateTime nel Database

La mia esigenza è quella di memorizzare tutte le date & data di volte nel fuso orario UTC nel database. Sto usando Java 8 LocalDate & LocalDateTime nel mio Hibernate.

È corretto come LocalDate & LocalDateTime non ha fuso orario associati?

Se non devo utilizzare nuovamente il buon vecchio (o legacy?) Date & Timestamp?

O dovrei usare Java 8 Instant? Se si utilizza Instant, ci sarà la possibilità di memorizzare solo la parte di data, senza tempo?

Il database è MySQL & SQL Server e questa è una Primavera di applicazione di Avvio.

  • Perché non utilizzare OffsetDateTime?
InformationsquelleAutor adi | 2017-04-18



3 Replies
  1. 38

    “Locale…” tipi di proposito, non hanno il concetto di fuso orario. In modo da non non rappresentare un momento sulla timeline. Un LocalDateTime rappresenta un vago gamma di possibili momenti, ma non ha alcun significato reale fino assegnazione di un offset o di fuso orario. Ciò significa che l’applicazione di un ZoneId per ottenere un ZonedDateTime.

    Per esempio, per dire che il Natale di quest’anno inizia il primo momento del 25 dicembre, noi diciamo:

    LocalDateTime ldt = LocalDateTime.of( 2017 , 12 , 25 , 0 , 0 , 0 , 0 );

    Ma che scoccare della mezzanotte avviene prima in oriente che in occidente.

    Che è il motivo per cui gli elfi della Logistica di reparto mappe di Santa itinerario a partire Kiribati nel Pacifico, il primo fuso orario del mondo in 14 ore avanti rispetto all’ora UTC. Dopo la consegna di lì, hanno percorso Santa ovest, a luoghi come la Nuova Zelanda, per la sua mezzanotte successiva. Poi a Asia per il loro mezzanotte successiva. Poi in India, e così via, fino all’Europa per il loro mezzanotte parecchie ore più tardi, e poi la costa orientale del Nord America per il loro mezzanotte un paio di ore più tardi. Tutti questi luoghi, per esperienza, che stesso LocalDateTime in momenti diversi, ogni consegna rappresentato da un diversi ZonedDateTime oggetto.

    Così…

    • Se si desidera registrare il concetto di Natale di partenza dopo la mezzanotte di mercoledì 25, utilizzare un LocalDateTime e scrivere in una colonna di database di tipo TIMESTAMP WITHOUT TIME ZONE.
    • Se si desidera registrare il momento esatto di ogni consegna di Santa rende, utilizzare un ZonedDateTime e scrivere in una colonna di database di tipo TIMESTAMP WITH TIME ZONE.

    Circa il secondo punto, essere consapevoli del fatto che quasi tutti i database di sistema utilizza le informazioni di zona per regolare la data e l’ora UTC e l’archivio che valore UTC. Alcune salvare le informazioni di zona, ma alcuni come Postgres scartare l’orario informazioni dopo l’uso regolare in UTC. Così “fuso orario” è qualcosa di un termine improprio, davvero senso “con rispetto per il fuso orario”. Se ti interessa, ricordare che la zona di origine, potrebbe essere necessario memorizzare il suo nome in una colonna a fianco.

    Un altro motivo per utilizzare Local… tipi è per gli appuntamenti futuri. I politici godono di cambiare frequentemente il loro fuso orario(s) di loro competenza. A loro piace di adottare l’Ora legale (DST). Per modificare le date del loro DST cutovers. A loro piace un calo della loro adozione dell’ora legale. A loro piace a ridefinire le proprie zone di tempo, di modificare i confini. A loro piace a ridefinire il loro offset-da-UTC, a volte, da importi come 15 minuti. E raramente di dare il preavviso, tali modifiche con un minimo di un mese o due di avviso.

    Così per fare il check-up medico appuntamento per il prossimo anno o sei mesi, la definizione di fuso orario non può essere previsto. Quindi, se volete un appuntamento delle 9 del mattino, si dovrebbe utilizzare un LocalTime o LocalDateTime registrati in un database colonna di tipo TIMESTAMP WITHOUT TIME ZONE. Altrimenti alle 9 di mattina appuntamento, se suddivisa in zone in cui l’ora legale cutover è rinviata, può apparire come AM 8 o 10 AM.

    Durante la generazione di una previsione di pianificazione, è possibile applicare un fuso orario (ZoneId) a quelli “locali” (unzoned) valori per creare ZonedDateTime oggetti. Ma non contare su di chi è troppo lontano nel tempo, quando i politici potrebbero rovinare il loro significato modifica della zona(s).

    Suggerimento: Queste le frequenti modifiche dell’ora legale e le zone di tempo significa che è necessario mantenere il vostro fuso orario tzdata base dati aggiornata. C’è un tzdata nel vostro sistema operativo host, JVM, e forse nel sistema di database come Postgres. Tutti e tre dovrebbero essere aggiornati di frequente. A volte le zone modificare più veloce del previsto cicli di aggiornamento di tali prodotti, come la Turchia l’anno scorso, decidendo di rimanere su DST solo con diverse settimane di preavviso. Quindi, occasionalmente, potrebbe essere necessario aggiornare manualmente quelli tzdata file. Oracle fornisce uno strumento per l’aggiornamento del tzdata di loro implementazioni Java.

    Generali di best practice nella gestione esatto momenti è quello di tenere traccia di loro in UTC. Applicare un fuso orario solo dove è necessario, come nella presentazione di un utente dove si aspettano di vedere i valori in proprio parrocchiale di fuso orario. In java.ora, il Instant classe rappresenta un momento nella timeline. In UTC, con una risoluzione dell’ordine dei nanosecondi.

    Instant instant = Instant.now() ;  //Current moment on the timeline in UTC.
    ZonedDateTime zdt = instant.atZone( z ) ;  //Assign a time zone to view the same moment through the lens of a particular region’s wall-clock time.
    Instant instant = zdt.toInstant();  //revert back to UTC, stripping away the time zone. But still the same moment in the timeline.

    A proposito, i driver conformi con JDBC 4.2 e versioni successive è possibile trattare direttamente con il java.tipi di orario, via:

    • PreparedStatement::setObject
    • ResultSet::getObject

    Evitare la vecchia legacy tipi di dati come java.util.Date e java.sql.Timestamp ogni volta che è possibile. Essi sono mal progettati, confusa e lacunosa.

    Capire che tutti e quattro sono la rappresentazione di un momento sulla timeline UTC:

    • Moderna
      • java.time.Instant
      • java.time.OffsetDateTime assegnato un offset di ZoneOffset.UTC
    • Legacy
      • java.util.Date
      • java.sql.Timestamp

    Se si desidera una sola data il valore senza tempo del giorno e senza fuso orario, utilizzare java.time.LocalDate. Questa classe soppianta java.sql.Date.

    Come per database specifici, essere a conoscenza di SQL standard appena tocca il tema del data-ora i tipi e la loro gestione. Inoltre, i vari database variano ampiamente, e intendo proprio ampiamente, nel sostenere la data e l’ora di caratteristiche. Alcuni hanno praticamente nessun supporto. Un po ‘ di mix di SQL standard di tipi di tipi di proprietà che predano i tipi standard o si propongono come alternative ai tipi standard. Inoltre, JDBC driver diversi nel loro comportamento con il marshalling data di valori in tempo per/dal database. Assicurarsi di leggere attentamente la documentazione e la pratica, pratica, pratica.

    Sospensione con Java 8 LocalDate & LocalDateTime nel Database

    • Sono molto d’accordo con l’affermazione che un momento in cui devono essere conservati in UTC e per essere suddivisa in zone solo durante la visualizzazione dell’utente.
    • Spero davvero che mia figlia di 8 anni (che sostiene Santa non è vero) arriva a leggere questo po ‘ di tempo. Non solo una grande risposta, ma con voto positivo con il tempo ho avuto modo di”, Che è il motivo per cui gli elfi..” 🙂
    • Fuso orario splendidamente spiegato. Con Voto Positivo, Grazie 🙂
  2. 7

    O dovrei usare Java 8 Istantanea? Se si utilizza Istante, ci sarà
    la possibilità di memorizzare solo la parte di data, senza tempo?

    Immediata dovrebbe essere adatto per la maggior parte delle operazioni.

    Aggiungere hibernate-java8 per pom.xml per il supporto Java 8 è tempo di API:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-java8</artifactId>
        <version>${version.hibernate}</version>
    </dependency>

    Quindi è possibile utilizzare LocalDate o LocalDateTime o Instant per Sospensione campi di entità. È necessario rimuovere @Temporal(TemporalType.TIMESTAMP).

    La mia esigenza è quella di memorizzare tutte le date & data di volte nel fuso orario UTC in
    il database. Sto usando Java 8 LocalDate & LocalDateTime nel mio
    Hibernate.

    È corretto come LocalDate & LocalDateTime non ha fuso orario
    associati?

    È possibile impostare di default la JVM di fuso orario da qualche parte in un configurazionale codice:

    @PostConstruct
    void setUTCTimezone() {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }

    Poi ti operano tempo UTC nel codice.

    Per l’utilizzo di Java 8 data di tipi in DTO, è necessario aggiungere Jsr310JpaConverters:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    E:

    @EntityScan(basePackageClasses = { Application.class,    Jsr310JpaConverters.class })
    SpringBootApplication
    public class Application {  }

    Più opzioni:

  3. -4

    Parte della nuova Data di API si dividono i tipi di date in alto. La corretta classe che include fusi orari è ZonedDateTime

    //Get the current date and time
          ZonedDateTime date1 = ZonedDateTime.parse("2007-12-03T10:15:30+05:30[Asia/Karachi]");
          System.out.println("date1: " + date1);
    
          ZonedDateTime zonedDateTime = ZonedDateTime.now();
          System.out.println("Zoned Date Time: " + zonedDateTime);
    
          ZoneId id = ZoneId.of("Europe/Paris");
          System.out.println("ZoneId: " + id);
    
          ZoneId currentZone = ZoneId.systemDefault();
          System.out.println("CurrentZone: " + currentZone);

    Stampa:

    date1: 2007-12-03T10:15:30+05:00[Asia/Karachi]
    Zoned Date Time: 2017-04-18T11:36:09.126-04:00[America/New_York]
    ZoneId: Europe/Paris
    CurrentZone: America/New_York
    • Sono consapevole del ZonedDateTime classe. La mia domanda è di più sull’utilizzo di LocalDate e LocalDateTime classi con Hibernate per la memorizzazione di date e datetime nel database in formato UTC.
    • Quindi si desidera utilizzare Instant più probabile con un DateFormatter
    • Grazie per la lettura di nuovo la domanda. Potete aggiornare la vostra risposta in modo che sia davvero rispondere alla domanda che ho chiesto?

Lascia un commento