2009-06-10 11 views

risposta

124

Per Timestamp, presumo si intenda java.sql.Timestamp. Si noterà che questa classe ha un costruttore che accetta un argomento long. È possibile analizzare questo utilizzando la classe DateFormat:

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

formato della data Normale ISO è AAAA-MM-dd, altrimenti grande! – vidstige

+1

nuovo timestamp (ora); dando errore che nessun costruttore come questo ha un lungo valore :( –

+1

@Bhanu I documenti mostrano che questo richiede molto tempo e sembra funzionare correttamente: http://docs.oracle.com/javase/7/docs/api/ java/sql/Timestamp.html # Timestamp (long) – Hazok

4

Secondo il API il costruttore che avrebbe accettato l'anno, il mese, e così via è deprecato. Invece dovresti usare il Costruttore che accetta un lungo. È possibile utilizzare un'implementazione Calendar per costruire la data desiderata e accedere alla rappresentazione temporale come lunga, ad esempio con il metodo getTimeInMillis.

16

Cosa intendi timestamp? Se vuoi dire millisecondi dalla Unix Epoch:

GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23); 
long millis = cal.getTimeInMillis(); 

Se si desidera un oggetto java.sql.Timestamp attuale:

Timestamp ts = new Timestamp(millis); 
+2

WRONG e non verrà compilato! Errore di compilazione: 09 è un numero ottale, ma 9 è fuori intervallo per gli ottali Errore logico: il mese è a base zero, si OTTOBRE 23/01/2007 –

+0

Non riesco a ottenere un errore logico se non viene compilato :): Scherzi a parte, buone catture, Carlos. L'octal che ho catturato prima ma incollato sbagliato comunque. :( –

+0

In realtà il costruttore Timestamp è privato, piuttosto si potrebbe usare il metodo Timestamp.valueOf() –

91

Che dire di questo?

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

Sì, funziona. –

+0

Questo ha funzionato per me, grazie – Tastybrownies

+1

Timestamp timestamp = Timestamp.valueOf ("2007-09-23 10: 10: 10.0 "); sta mostrando il metodo valueOf non definito per il tipo Timestamp in jDK 7 –

4

Si potrebbe anche effettuare le seguenti operazioni:

// 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! Riceverai qualcosa del tipo: "2009-10-23 15: 26: 56.171" Il mese è a base zero, quindi 9 è ottobre! –

+0

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

+1

Oh, e ho messo "non testato" :) –

-1

Una risposta più generale sarebbe quello di importare java.util.Date, poi, quando è necessario impostare un timestamp uguale alla data corrente, è sufficiente impostare uguale a new Date().

+0

perché ** Data ("stringa"); ** è deprecato –

+0

timestamp non corrente, ma una data specificata – zeekvfu

1

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

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

Buona risposta, ma hai perso un elemento * cruciale *: ** fuso orario **. Se si omette un fuso orario, il fuso orario predefinito corrente della JVM viene applicato all'oggetto 'DateTime'.Ciò significa che i ** risultati variano * su vari computer o configurazione del sistema operativo host o delle impostazioni JVM. Per risultati prevedibili, passare un fuso orario a quel costruttore 'DateTime'. Scegli il [nome del fuso orario appropriato] (http://en.wikipedia.org/wiki/List_of_tz_database_time_zones) per la tua intenzione. Ad esempio, 'DateTimeZone.forID (" America/Montreal ")' o 'DateTimeZone.UTC'. –

+0

Questo codice potrebbe essere più breve. Non è necessario convertire in java.util.Date per ottenere e passare millisecondi-poiché- [epoca] (http://en.wikipedia.org/wiki/Epoch_ (reference_date)). Basta chiedere l'oggetto 'DateTime' per i suoi millisecondi-da-epoca. Sostituisci '.toDate(). GetTime()' con ['.getMillis()'] (http://www.joda.org/joda-time/apidocs/org/joda/time/base/BaseDateTime.html#getMillis()). –

+0

grazie, ho risolto entrambi i tuoi punti positivi. – user152468

6

tl; dr

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

java.time

aggiornamento Let questa pagina, mostrando codice utilizzando il framework java.time integrato in Java 8 e versioni successive.

Queste nuove classi sono ispirate allo Joda-Time, definito da JSR 310 e ampliato dal progetto ThreeTen-Extra. Soppiantano le notoriamente fastidiose vecchie lezioni di data-ora in bundle con le prime versioni di Java.

In java.time, un Instant è un momento sulla timeline in UTC. Un ZonedDateTime è un istantaneo regolato in un fuso orario (ZoneId).

Il fuso orario è fondamentale qui. Una data di September 23, 2007 non può essere tradotta in un momento sulla timeline senza applicare un fuso orario. Considera che un nuovo giorno sorge prima a Parigi che a Montréal, dove è ancora "ieri".

Inoltre, un java.sql.Timestamp rappresenta sia una data che l'ora del giorno. Quindi dobbiamo iniettare un momento della giornata per andare avanti con la data. Supponiamo che tu voglia il primo momento della giornata come l'ora del giorno.Si noti che questo non è sempre il tempo 00:00:00.0 a causa dell'ora legale e forse altre anomalie.

Si noti che a differenza della vecchia classe java.util.Date e, a differenza di Joda-Time, i tipi java.time hanno una risoluzione di nanosecondi anziché millisecondi. Questo corrisponde alla risoluzione di java.sql.Timestamp.

Si noti che java.sql.Timestamp ha una brutta abitudine di applicare implicitamente il fuso orario predefinito di JVM al suo valore di data-ora quando genera una rappresentazione di stringa tramite il suo metodo toString. Qui vedi il mio fuso orario America/Los_Angeles applicato. Al contrario, le classi java.time sono più sane, usando i formati standard ISO 8601.

LocalDate d = LocalDate.of (2007 , 9 , 23) ; 
ZoneId z = ZoneId.of ("America/Montreal") ; 
ZonedDateTime zdt = d.asStartOfDay(z) ; 
Instant instant = zdt.toInstant() ; 
java.sql.Timestamp ts = java.sql.Timestamp.from (instant) ; 

Discarica per consolle.

System.out.println ("d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts); 

Quando eseguito.

d: 2007-09-23 = zdt: 2007-09-23T00:00-04:00[America/Montreal] = instant: 2007-09-23T04:00:00Z = ts: 2007-09-22 21:00:00.0

A proposito, a partire da JDBC 4.2, è possibile utilizzare direttamente i tipi java.time. Non è necessario per java.sql.Timestamp.

  • PreparedStatement.setObject
  • ResultSet.getObject