Risposte:
Da Timestamp
, presumo tu intenda java.sql.Timestamp
. Noterai che questa classe ha un costruttore che accetta un long
argomento. Puoi analizzarlo usando la DateFormat
classe:
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
java.util.Date
, java.util.Calendar
e java.text.SimpleDateFormat
sono ora legacy , soppiantate dalle classi java.time incorporate in Java 8 e versioni successive. Vedi Tutorial di Oracle .
Che dire di questo?
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
Cosa intendi con timestamp? Se intendi millisecondi dall'epoca Unix:
GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
Se vuoi un oggetto java.sql.Timestamp effettivo:
Timestamp ts = new Timestamp(millis);
Calendar.SEPTEMBER
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
Aggiorniamo questa pagina mostrando il codice usando java.time framework integrato in Java 8 e successive.
Queste nuove classi sono ispirate da Joda-Time , definite da JSR 310 e ampliate dal ThreeTen-Extra . Soppiantano le notoriamente problematiche vecchie classi data-ora in bundle con le prime versioni di Java.
In java.time, an Instant
è un momento sulla timeline in UTC. A ZonedDateTime
è un Istantaneo regolato in un fuso orario ( ZoneId
).
Il fuso orario è fondamentale qui. September 23, 2007
Non è possibile tradurre una data di in un momento sulla sequenza temporale senza applicare un fuso orario. Considera che un nuovo giorno sorge prima a Parigi che a Montréal dove è ancora “ieri”.
Inoltre, java.sql.Timestamp rappresenta sia la data che l'ora. Quindi dobbiamo iniettare un'ora del giorno per andare insieme alla data. Presumiamo che tu voglia il primo momento della giornata come ora del giorno. Nota che questo non è sempre il momento00:00:00.0
causa dell'ora legale e forse di altre anomalie.
Si noti che a differenza della vecchia classe java.util.Date e diversamente da Joda-Time, i tipi java.time hanno una risoluzione di nanosecondi anziché di millisecondi. Ciò corrisponde alla risoluzione di java.sql.Timestamp.
Si noti che java.sql.Timestamp ha la sgradevole abitudine di applicare implicitamente il fuso orario predefinito corrente della JVM al valore data-ora quando si genera una rappresentazione di stringa tramite il suo toString
metodo. Qui vedi il mio America/Los_Angeles
fuso orario applicato. Al contrario, le classi java.time sono più sensate, utilizzando i formati ISO 8601 standard .
LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.atStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;
Scarica su console.
System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
Quando corri.
d: 2007-09-23 = zdt: 2007-09-23T00: 00-04: 00 [America / Montreal] = istantaneo: 2007-09-23T04: 00: 00Z = ts: 2007-09-22 21:00: 00.0
A proposito, a partire da JDBC 4.2, puoi usare direttamente i tipi java.time. Non ce n'è bisogno java.sql.Timestamp
.
PreparedStatement.setObject
ResultSet.getObject
Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time 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ù, vedere il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .
Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizza un driver JDBC conforme a JDBC 4.2 o successivo. Non c'è bisogno di stringhe, non c'è bisogno di java.sql.*
classi.
Dove ottenere le classi java.time?
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili future aggiunte a java.time. Si possono trovare alcune classi utili, come per esempio Interval
, YearWeek
, YearQuarter
e altro .
Puoi anche fare quanto segue:
// untested
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant...
cal.set(Calendar.MONTH, 8);// -1 as month is zero-based
cal.set(Calendar.YEAR, 2009);
Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
Secondo l' API, il costruttore che accetterebbe anno, mese e così via è deprecato. Invece dovresti usare il Constructor che accetta un file long. È possibile utilizzare un'implementazione di Calendar per costruire la data desiderata e accedere alla rappresentazione dell'ora come un lungo, ad esempio con il metodo getTimeInMillis .
Per completezza, anche una soluzione con Joda-Time versione 2.5 e la sua DateTime
classe:
new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
DateTime
all'oggetto viene applicato il fuso orario predefinito corrente della JVM . Ciò significa che i risultati varieranno tra i vari computer o la configurazione del sistema operativo host o le impostazioni JVM. Per risultati prevedibili, passare un fuso orario a quel DateTime
costruttore. Scegli il nome del fuso orario corretto per la tua intenzione. Ad esempio, DateTimeZone.forID( "America/Montreal" )
o DateTimeZone.UTC
.
DateTime
all'oggetto i suoi millisecondi dall'epoca. Sostituisci .toDate().getTime()
con .getMillis()
.
DateTimeZone.getDefault()
e passando il risultato come argomento facoltativo. (A proposito, idem per Locale.getDefault()
, stesso problema sull'ambiguità degli argomenti opzionali.)
Una risposta più generale sarebbe importare java.util.Date
, quindi quando è necessario impostare un valore timestamp
uguale alla data corrente, è sufficiente impostarlo uguale a new Date()
.