- 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.
- 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
).
fonte
2018-01-11 10:57:00
Provare ad analizzare con, ad esempio, 'SimpleDateFormat'. – bdares
Non utilizzare la stringa. Mantieni l'oggetto Date e trasforma solo in String quando necessario. – m0skit0
Potrebbe essere una buona idea fornire un contesto su ciò che stai davvero cercando di ottenere. – flesk