2015-04-20 12 views
27

Qual è il modo corretto di convertire tra java.sql.Date e LocalDate (Java8)?Conversione tra LocalDate e sql.Date

+3

La formulazione sulla questione in sé è un bene anche per quelli/specificamente alla ricerca di conversione da java.sql .Date a java.time.LocalDate, anche se l'altra domanda ha una risposta simile. –

risposta

51

La versione Java 8 (e successive) di java.sql.Date ha un supporto incorporato per LocalDate, tra cui toLocalDate e valueOf(LocalDate).

Per convertire LocalDate-java.sql.Date è possibile utilizzare

java.sql.Date.valueOf(localDate); 

E convertire da java.sql.Date a LocalDate:

sqlDate.toLocalDate(); 

Fuso orario:

I LocalDate tipo memorizza senza tempo informazioni sulla zona, mentre java.sql.Date fa. Pertanto, quando si utilizzano le conversioni di cui sopra, i risultati dipendono dal fuso orario predefinito del sistema (come indicato nei commenti).

Se non si vuole fare affidamento sul fuso orario di default, è possibile utilizzare la seguente conversione:

Date now = new Date(); 
LocalDate current = now.toInstant() 
         .atZone(ZoneId.systemDefault()) // Specify the correct timezone 
         .toLocalDate(); 
+4

Si noti che questo utilizza il fuso orario predefinito del sistema per interpretare la data, che potrebbe essere o meno ciò che si desidera. Spesso è preferibile specificare il fuso orario esplicitamente! – marc82ch

+0

@ marc82ch A ['LocalDate'] (https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html) esplicitamente non ha un fuso orario. Puoi aggiungere alcuni dettagli su come specificarne uno e in che modo ciò influenzerebbe le cose? – beldaz

+0

@beldaz Potrei sbagliarmi, non conosco davvero le parti interne, ma penso che un java.sql.Date sia rappresentato da un lungo timestamp dall'epoca (UTC). Quindi, quando legge dal campo DB DATE, deve essere interpretato (dal driver) per rappresentarlo come un lungo. Ricorda che java.sql.Date eredita da java.util.Date. Quindi è fondamentalmente un termine Instant in Java 8 e la conversione in un LocalDate richiede un fuso orario. Ma penso che finché il driver JDBC e il tuo codice usano lo stesso fuso orario predefinito, non importa. – marc82ch

Problemi correlati