Java Timestamp - Come posso creare un Timestamp con la data 23/09/2007?


Risposte:


154

Da Timestamp, presumo tu intenda java.sql.Timestamp. Noterai che questa classe ha un costruttore che accetta un longargomento. Puoi analizzarlo usando la DateFormatclasse:

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);

1
Il formato normale della data ISO è aaaa-MM-gg, altrimenti ottimo!
vidstige

1
nuovo Timestamp (ora); dando errore che nessun costruttore come questo che prenda un valore lungo :(
Bhanu Sharma

1
@Bhanu I documenti mostrano che questo richiede un valore lungo e sembra funzionare correttamente: docs.oracle.com/javase/7/docs/api/java/sql/…
Hazok

Cordiali saluti, le vecchie classi data-ora terribilmente problematiche come java.util.Date, java.util.Calendare java.text.SimpleDateFormatsono ora legacy , soppiantate dalle classi java.time incorporate in Java 8 e versioni successive. Vedi Tutorial di Oracle .
Basil Bourque

121

Che dire di questo?

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");

1
Timestamp timestamp = Timestamp.valueOf ("2007-09-23 10: 10: 10.0"); mostra che il metodo valueOf non è definito per il tipo Timestamp in jDK 7
Ashish Ratan

nuovo Timestamp (ora); dando errore che nessun costruttore come questo che prenda un valore stringa :(
Bhanu Sharma

@Bhanu Il costruttore prende il tempo unix in millisecondi. Usa il metodo statico valueOf se vuoi ottenere un timestamp da una stringa.
Hazok

4
Questa sembra essere la migliore risposta alla domanda.
Hazok

1
La migliore risposta ha Date, che è deprecato, è una cattiva pratica usarlo. Questa risposta è migliore. Grazie
Alberici

18

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);

2
SBAGLIATO e non verrà compilato! Errore di compilazione: 09 è un numero ottale, ma 9 non è compreso nell'intervallo per gli ottali. Errore logico: il mese è a base 0, riceverai il 23 OTTOBRE 2007
user85421

Non riesco a ottenere un errore logico se non si compila. :) Scherzi a parte, buone catture, Carlos. L'ottale che ho preso prima ma incollato comunque in modo sbagliato. :(
Matthew Flaschen

In realtà il costruttore Timestamp è deprecato piuttosto potresti usare il metodo Timestamp.valueOf ()
Shiva Komuravelly

@ShivaKomuravelly non tutti i costruttori di timestamp sono deprecati e almeno non ci vogliono millisecondi, il costruttore che prende la data come argomento è deprecato
nessun nome

E c'è una costante per questo (invece di mese = 9):Calendar.SEPTEMBER
Guillaume Husta

11

tl; dr

java.sql.Timestamp.from (
    LocalDate.of ( 2007 , 9 , 23 )
             .atStartOfDay( ZoneId.of ( "America/Montreal" ) )
             .toInstant()
)

java.time

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, 2007Non è 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 toStringmetodo. Qui vedi il mio America/Los_Angelesfuso 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

Informazioni su java.time

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, YearQuartere altro .


3
Mi chiedo come posso ottenere OP o mod per contrassegnare la tua risposta come corretta. La risposta accettata è così obsoleta.
sttaq

Molto carino, tranne che per un errore di battitura. asStartOfDay () dovrebbe essere atStartOfDay ().
Tullochgorum

@Tullochgorum fisso. Grazie. Cordiali saluti, su Stack Overflow, sei libero di apportare tali modifiche da solo, se sei così propenso.
Basil Bourque

5

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());

2
SBAGLIATO: prova un System.out.println del risultato! Otterrai qualcosa del tipo: "2009-10-23 15: 26: 56.171" Il mese è a base 0, quindi il 9 è ottobre!
user85421

Sapevo che una di quelle costanti era a base zero, grazie. Post aggiornato.
Alex

1
Oh, e ho messo "non testato" :)
Alex

4

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 .


1

Per completezza, anche una soluzione con Joda-Time versione 2.5 e la sua DateTimeclasse:

new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())

1
Bella risposta, ma ti sei perso un pezzo cruciale : il fuso orario . Se si omette un fuso orario, DateTimeall'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 DateTimecostruttore. Scegli il nome del fuso orario corretto per la tua intenzione. Ad esempio, DateTimeZone.forID( "America/Montreal" )o DateTimeZone.UTC.
Basil Bourque

Quel codice potrebbe essere più breve. Non è necessario convertire in java.util.Date per ottenere e passare i millisecondi dall'epoca . Basta chiedere DateTimeall'oggetto i suoi millisecondi dall'epoca. Sostituisci .toDate().getTime()con .getMillis().
Basil Bourque

@BasilBourque A seconda delle circostanze, potresti voler omettere il fuso orario per ottenere risultati prevedibili. "Nel tuo fuso orario attuale" può essere un risultato perfettamente ragionevole e prevedibile. Perché codificare un fuso orario o chiedere agli utenti di impostare manualmente un fuso orario quando il loro computer ha già impostato un fuso orario? Certamente sarei piuttosto sorpreso se un'applicazione sul mio computer iniziasse a produrre date adattate al fuso orario America / Montreal.
dan carter

@dancarter L'omissione del fuso orario facoltativo genera confusione. L'omissione solleva l'ambiguità di (a) il programmatore intendeva fare affidamento sul valore predefinito implicito o (b) il programmatore non ha considerato i problemi di fuso orario (come è fin troppo comune). Se si desidera effettivamente utilizzare l'attuale fuso orario predefinito della JVM, dillo esplicitamente chiamando DateTimeZone.getDefault()e passando il risultato come argomento facoltativo. (A proposito, idem per Locale.getDefault(), stesso problema sull'ambiguità degli argomenti opzionali.)
Basil Bourque,

-1

Una risposta più generale sarebbe importare java.util.Date, quindi quando è necessario impostare un valore timestampuguale alla data corrente, è sufficiente impostarlo uguale a new Date().


perché ** Date ("string"); ** è deprecato
Ashish Ratan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.