tl; dr
myPreparedStatement.setObject( // Directly exchange java.time objects with database without the troublesome old java.sql.* classes.
… ,
LocalDate.parse( // Parse string as a `LocalDate` date-only value.
"2018-01-23".replace(" " , "T") // Alter input string to comply with standard ISO 8601 formatting.
)
)
java.time
L'approccio moderno utilizza i java.time classi che soppiantano le classi legacy vecchi problematici, come java.util.Date
e java.sql.Date
.
Per un valore di sola data, utilizzare LocalDate
. La classe LocalDate
rappresenta un valore di sola data senza ora del giorno e senza fuso orario.
Trasforma la stringa di input in base alla formattazione ISO 8601 standard. Sostituisci lo SPAZIO nel mezzo con uno T
.
String input = "2018-01-23".replace(" " , "T") ;
Le classi java.time utilizzano formati standard durante l'analisi/generazione di stringhe. Quindi non c'è bisogno di specificare un modello di formattazione.
LocalDate ld = LocalDate.parse(input) ;
È possibile scambiare direttamente java.time oggetti con il database utilizzando una JDBC driver compatibile con JDBC 4.2 o successivo. Puoi dimenticare di trasformare dentro e fuori le classi java.sql. *.
myPreparedStatement.setObject(… , ld) ;
Recupero:
LocalDate ld = myResultSet.getObject(… , LocalDate.class) ;
Chi java.time
Il quadro java.time è integrato in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi di data legacy come java.util.Date
, Calendar
, & SimpleDateFormat
.
Il progetto Joda-Time, ora in maintenance mode, consiglia la migrazione alle classi java.time.
Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310.
Dove ottenere le classi java.time?
- Java SE 8, Java SE 9, e più tardi
- incorporato.
- 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
- Molte delle funzionalità java.time è di back-porting per Java 6 .
- Android
- versioni successive di implementazioni fascio Android delle classi java.time.
- Per Android precedente, il progetto ThreeTenABP si adatta a ThreeTen-Backport (menzionato sopra). Vedi How to use ThreeTenABP….
Il progetto ThreeTen-Extra java.time prolunga con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. È possibile trovare alcune classi utili come Interval
, YearWeek
, YearQuarter
e more.
A seconda del caso d'uso, è possibile che non si desideri inviare la data dal client. Invece, avere un trigger di inserimento sulla tabella per impostare la colonna su "now" sul lato server db. In questo modo è possibile avere un timestamp coerente sul lato server, proteggersi dai problemi dell'orologio lato client/fuso orario e avere nuovi record che mantengono la data aggiornata se i record vengono inseriti da un'altra app client o transazione addhoc. – Glenn
grazie anche per il consiglio. – giozh