2013-08-15 18 views
30

Ho bisogno di aggiungere la data corrente in una dichiarazione preparata di una chiamata JDBC. Devo aggiungere la data in un formato come yyyy/MM/dd.Ottenere la data corrente nel formato java.sql.Date

Ho provare con

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); 
Date date = new Date(); 
pstm.setDate(6, (java.sql.Date) date); 

ma ho questo errore:

threw exception 
java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date 

C'è un modo per ottenere un oggetto java.sql.Date con lo stesso formato?

+0

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

+0

grazie anche per il consiglio. – giozh

risposta

59

A java.util.Date non è un java.sql.Date. È il contrario. A java.sql.Date è un java.util.Date.

Avrete bisogno di convertirlo in un java.sql.Date utilizzando il constructor that takes a long che un java.util.Date può fornire.

java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); 
+0

E la data attuale? – Yster

+1

@Yster La domanda aveva già la data corrente: 'Data data = nuova Data();'.Riguarda la conversione di un 'java.util.Date' in un' java.sql.Date'. – rgettman

+0

Oh OK, grazie. – Yster

23

Semplicemente in una sola riga:

java.sql.Date date = new java.sql.Date(Calendar.getInstance().getTime().getTime()); 
+1

perché mi dà sempre la mezzanotte e non l'ora corrente? –

+2

per il tempo necessario 'java.sql.Time time = new java.sql.Time (Calendar.getInstance(). GetTime(). GetTime());' –

11
new java.sql.Date(Calendar.getInstance().getTimeInMillis()); 
0

È possibile ottenere voi gol con modi di seguito: -

long millis=System.currentTimeMillis(); 
java.sql.Date date=new java.sql.Date(millis); 

o

// create a java calendar instance 
Calendar calendar = Calendar.getInstance(); 

// get a java date (java.util.Date) from the Calendar instance. 
// this java date will represent the current date, or "now". 
java.util.Date currentDate = calendar.getTime(); 

// now, create a java.sql.Date from the java.util.Date 
java.sql.Date date = new java.sql.Date(currentDate.getTime()); 
0

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.

Problemi correlati