2012-02-24 18 views
5

Ho ottenuto una stringa chiamando il metodo toString di istanza della classe Date.
Come posso ottenere un oggetto Date da questa stringa?Come convertire Date.toString di nuovo alla data?

Date d = new Date(); 
String s = d.toString; 
Date theSameDate = ... 

UPDATE
Ho cercato di usare SimpleDateFormat, ma ho java.text.ParseException: Unparseable date Potete dirmi il formato della data prodotta da Date.toString()?

+0

Provare ad analizzare con, ad esempio, 'SimpleDateFormat'. – bdares

+1

Non utilizzare la stringa. Mantieni l'oggetto Date e trasforma solo in String quando necessario. – m0skit0

+1

Potrebbe essere una buona idea fornire un contesto su ciò che stai davvero cercando di ottenere. – flesk

risposta

12

Se il vostro obiettivo reale è di serializzare un oggetto Date per una sorta di persistenza su misura o il trasferimento di dati, una soluzione semplice sarebbe:

Date d = new Date(); 
long l = d.getTime(); 
Date theSameDate = new Date(l); 
+1

FYI: La fastidiosa classe' Date' è ormai legacy, sostituita da 'Instant' e le altre * classi java.time *. Vedi l'approccio moderno in [questa risposta] (https://en.m.wikipedia.org/wiki/ISO_8601) di Ole V.V. –

2

Dai uno sguardo allo SimpleDateFormat#parse(). Dovrebbe fornire la funzionalità che stai cercando.

+0

Quella classe è ora superata da 'DateTimeFormatter'. –

-1

Date theSameDate = new Date(Date.parse(s));

Per alcune ragioni non così ovvio, questo non è particolarmente buona idea. Puoi trovare i dettagli su questo nella documentazione API per il metodo di analisi. Un problema è ad es. che le abbreviazioni del fuso orario sono ambigue, in modo che il parser possa fallire nell'interpretazione del fuso orario corretto.

+0

Anche 'Date.parse()' è stato ritirato molto tempo fa. –

8

Si potrebbe fare in questo modo

Date d = new Date(); 
String s = d.toString; 
Date theSameDate = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy").parse(s); 
+0

Questo metodo funziona anche con la libreria org.json quando si convertono oggetti Data Java in e da JSONObjects utilizzando la funzione di costruzione bean, poiché utilizza Date.toString() durante la costruzione di JSONObjects. Grazie per questo, è esattamente il formato per SimpleDateFormat che stavo cercando. –

+0

FYI, le vecchie classi fastidiose qui usate sono ormai obsolete, soppiantate dalle classi * java.time *. –

2
  1. Se il tuo vero obiettivo è serializzare e deserializzare una data e un'ora (per il trasferimento dei dati o per la persistenza, ad esempio), serializza su ISO 8601, il formato standard per i dati di data e ora.
  2. Salta la classe obsoleta Date. La moderna API data e ora Java nota come java.time è molto più carina con cui lavorare. Il corso di cui hai bisogno è probabilmente lo Instant (questo dipende dai tuoi requisiti più esatti).

I due punti vanno bene a braccetto: toString metodi

Instant i = Instant.now(); 
    String s = i.toString(); 
    Instant theSameInstant = Instant.parse(s); 

Le classi moderne produrre formato ISO 8601 (per esempio, 2018-01-11T10:59:45.036Z), ed i loro metodi di parse leggono lo stesso formato di nuovo. Quindi questo frammento è tutto ciò di cui hai bisogno e ottieni un istante uguale al primo, con precisione in nanosecondi.

Se non è possibile controllare la stringa che si ottiene, e si ottiene il risultato dal Date.toString(), la stringa di modello formato Sedalb’s answer lavori con java.time troppo:

DateTimeFormatter dtf 
      = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT); 
    Date d = new Date(); 
    String s = d.toString(); 
    Instant nearlyTheSameInstant = ZonedDateTime.parse(s, dtf).toInstant(); 

E 'essenziale per fornire un locale. In caso contrario verrà utilizzata la locale predefinita di JVM e, se non è inglese, l'analisi non riuscirà. Nel peggiore dei casi vedrete il vostro codice funzionare bene per molti anni e improvvisamente si romperà quando un giorno qualcuno lo eseguirà su un computer o dispositivo con impostazioni internazionali diverse.

Il punto da jambjo’s answer applica ancora: I tre e quattro lettere abbreviazioni fuso orario utilizzate in Date.toString() sono molto spesso ambigua, quindi non si garantisce che il fuso orario viene interpretato correttamente, e ancora, saranno interpretati in modo diverso su diverse JVM.

Infine, Date.toString() non esegue il rendering dei millisecondi detenuti da Date, il che porta a un'accuratezza fino a 999 millisecondi. Se si utilizza la stringa da Date.toString(), non c'è nulla che possiamo fare al riguardo (motivo per cui ho chiamato la variabile nearlyTheSameInstant).

+1

tl; dr 'Instant.parse (Instant.now(). ToString())' –

Problemi correlati