data della data di java sql

Quando inserisco SQL DateTime nel database ottengo 2007-02-07 12:00:00.00

Ma ho reso l’object Date come questo: 2007-02-07 17:29:46.00

Come ottenere il valore dei secondi nel database. Ritorna sempre alle 12:00:00.00

 date.setYear(Integer.valueOf(parsedDate[2].replaceAll(" ", "")) - 1900); date.setMonth(Integer.valueOf(parsedDate[0].replaceAll(" ", ""))); date.setDate(Integer.valueOf(parsedDate[1].replaceAll(" ", ""))); ... java.sql.Date sqlDate = new java.sql.Date(date.getTime()); 

Dovrei usare qualsiasi formattatore?

java.sql.Date rappresenta una data, non una data e un’ora. Dai documenti :

Per conformarsi alla definizione di SQL DATE, i valori millisecondi racchiusi da un’istanza java.sql.Date devono essere ‘normalizzati’ impostando le ore, i minuti, i secondi e i millisecondi a zero nel particolare fuso orario a cui l’istanza è associata .

Se si desidera memorizzare una data e un’ora, è necessario cercare un altro tipo, ad esempio java.sql.Timestamp . EDIT: Questo non sta suggerendo di usare un tipo di colonna TIMESTAMP – come dice paulsm4 nei commenti, questa è una cosa diversa. Tuttavia, per quanto posso vedere, JDBC supporta solo:

  • Date (no, anche tu vuoi un momento)
  • Time (no, vuoi anche un appuntamento)
  • Timestamp (include una data e un’ora, ma non vuoi la semantica SQL TIMESTAMP)

Mi aspetterei di utilizzare il tipo Timestamp Java con una colonna DATETIME per funzionare, anche se senza il livello di precisione fornito da Timestamp .

EDIT: dopo un po ‘di ricerca, sembra che tu voglia usare il tipo java.sql.Time , ma con parametri speciali del driver – almeno se stai usando il driver Microsoft. Vedere questi documenti sulla configurazione di JDBC per ulteriori informazioni.

tl; dr

Probabilmente sei confuso dal non capire che java.util.Date è un tipo data-with-time mentre la sua sottoclass java.sql.Date finge di essere una class data-only ma in realtà ha il suo orario impostato a zero. Sanguinante design terribile. Evita completamente entrambe queste classi. Utilizza solo le classi java.time .

Per una colonna di sola data nel database, definire la colonna come tipo DATE standard SQL.

 myPreparedStatement.setObject( … , LocalDateTime.parse( "2007-02-07 17:29:46.00".replace( " " , "T" ) ) .toLocalDate() ) 

java.time

L’approccio moderno utilizza le classi java.time aggiunte a Java 8 e versioni successive.

Quando inserisco SQL DateTime nel database ottengo 2007-02-07 12: 00: 00.00

Non esiste un tipo standard SQL come DateTime , né alcuna class di questo tipo in Java. Quindi non conosco la tua intenzione lì.

Per quanto riguarda la stringa di input, 2007-02-07 17:29:46.00 , analizzarla come LocalDateTime perché manca qualsiasi indicatore di fuso orario o offset-da-UTC.

Questo formato in stile SQL è quasi conforms allo standard ISO 8601 . Per soddisfare pienamente, sostituire lo SPAZIO nel mezzo con una T Le classi java.time utilizzano i formati ISO 8601 per impostazione predefinita durante l’analisi / generazione di stringhe.

 String input = "2007-02-07 17:29:46.00".replace( " " , "T" ) ; 

Parse.

 LocalDateTime ldt = LocalDateTime.parse( input ) ; 

Un LocalDateTime non rappresenta un momento, non è un punto sulla timeline. Rappresenta i potenziali momentjs lungo un intervallo di circa 26-27 ore.

SQL standard offre un tipo di dati per tale valore, TIMESTAMP WITHOUT TIME ZONE .

Oggetti intelligenti, stringhe non stupide

L’intero approccio è fuorviato, si tratta di un testo e si utilizzano le lezioni di data e ora legacy. Invece, scambia gli oggetti java.time .

A partire da JDBC 4.2, non è necessario utilizzare mai i fastidiosi vecchi tipi java.sql.Date come java.sql.Date o java.sql.Timestamp . È ansible scambiare direttamente oggetti java.time con il proprio database tramite i metodi setObject / getObject .

 myPreparedStatement.setObject( … , ldt ) ; 

E recupero.

 LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ; 

Se si sta tentando di utilizzare valori di sola data, utilizzare lo standard SQL tipo DATE e la class Java LocalDate .

 LocalDate ld = ldt.toLocalDate() ; myPreparedStatement.setObject( … , ld ) ; 

Come ottenere il valore dei secondi nel database

Non sei sicuro di cosa intendi per “valore dei secondi”.

Forse vuoi un conteggio di secondi dall’epoca di riferimento del primo momento del 1970 in UTC.

 long secondsSinceEpoch = ldt.toEpochSecond() ; 

Se il tuo objective era semplicemente istanziare un java.sql.Date , non preoccuparti. Non usare mai più quella class. Ma, FYI, il tuo problema specifico è probabilmente un effetto collaterale del design terribile usato per quella class. La class java.sql.Date eredita da java.util.Date che è un tipo data-con-time. La class java.sql.Date finge di essere un valore di sola data, ma in realtà ha impostato l’ora del giorno su 00:00:00. Ancora peggio, la documentazione ci dice di ignorare il fatto di essere una sottoclass. Non preoccuparti di cercare di capirlo; basta usare java.time invece.

Se stai provando a lavorare con l’ora del giorno da solo, estrai un object LocalTime .

 LocalTime lt = ldt.toLocalTime() ; 

Se si desidera impostare l’ora a zero, è probabile che si desideri un valore di sola data. In tal caso, utilizzare la class LocalDate per un valore data senza un’ora e senza fuso orario.

 LocalDate ld = ldt.toLocalDate() : 

Se desideri il primo momento della giornata in tale data, chiama LocalDate::atStartOfDay .

 LocalDateTime ldtStart = ldt.toLocalDate().atStartOfDay() ; 

ATTENZIONE: se stai cercando di tracciare i momentjs reali, i punti specifici sulla timeline, allora tutto questo codice sopra è sbagliato. Ricerca overflow dello stack per informazioni ZonedDateTime classi Instant , ZoneId e ZonedDateTime . Cerca sia Stack Overflow che dba.StackExchange.com per informazioni sul tipo di SQL standard TIMESTAMP WITH TIME ZONE .


A proposito di java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantano le fastidiose vecchie lezioni di data e ora come java.util.Date , Calendar e SimpleDateFormat .

Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione alle classi java.time .

Per saperne di più, consultare l’ esercitazione Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

È ansible scambiare oggetti java.time direttamente con il proprio database. Utilizzare un driver JDBC compatibile con JDBC 4.2 o successivo. Nessuna necessità di stringhe, nessuna necessità per le classi java.sql.* .

Dove ottenere le classi java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 e versioni successive
    • Built-in.
    • Parte dell’API Java standard con un’implementazione in bundle.
    • Java 9 aggiunge alcune funzionalità e correzioni minori.
  • Java SE 6 e Java SE 7
    • Gran parte della funzionalità java.time è back-porting su Java 6 e 7 in ThreeTen-Backport .
  • android
    • Versioni successive di implementazioni di bundle Android delle classi java.time.
    • Per Android precedente (<26), il progetto ThreeTenABP adatta ThreeTen-Backport (menzionato sopra). Vedi Come usare ThreeTenABP ….

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. Puoi trovare alcune classi utili come Interval , YearWeek , YearQuarter e altro .