tl; dr
myUtilDate.toInstant() // Convert `java.util.Date` to `Instant`.
.atOffset( ZoneOffset.UTC ) // Transform `Instant` to `OffsetDateTime`.
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // Generate a String.
.replace( "T" , " " ) // Put a SPACE in the middle.
14/11/2014 14:05:09
java.time
Il modo moderno è con le classi java.time che ora soppiantano le vecchie problematiche classi data-ora.
Per prima cosa converti il tuo java.util.Date
in un Instant
. La Instant
classe rappresenta un momento sulla linea temporale in UTC con una risoluzione di nanosecondi (fino a nove (9) cifre di una frazione decimale).
Le conversioni da / a java.time vengono eseguite con nuovi metodi aggiunti alle vecchie classi.
Instant instant = myUtilDate.toInstant();
Entrambi sono java.util.Date
e java.time.Instant
sono in UTC . Se vuoi vedere la data e l'ora come UTC, così sia. Chiama toString
per generare una stringa in formato ISO 8601 standard .
String output = instant.toString();
2014-11-14T14: 05: 09Z
Per altri formati, devi trasformare il tuo Instant
in più flessibile OffsetDateTime
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
odt.toString (): 2020-05-01T21: 25: 35.957Z
Vedi quel codice eseguito dal vivo su IdeOne.com .
Per ottenere una stringa nel formato desiderato, specificare a DateTimeFormatter
. È possibile specificare un formato personalizzato. Ma userei uno dei formattatori predefiniti ( ISO_LOCAL_DATE_TIME
) e sostituirò il T
suo output con uno SPAZIO.
String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
14/11/2014 14:05:09
A proposito, non consiglio questo tipo di formato in cui si perdono intenzionalmente le informazioni offset-UTC o del fuso orario. Crea ambiguità sul significato del valore data-ora di quella stringa.
Fai anche attenzione alla perdita di dati, poiché ogni secondo frazionario viene ignorato (efficacemente troncato) nella rappresentazione della stringa del valore data-ora.
Per vedere quello stesso momento attraverso l'obiettivo del tempo dell'orologio a parete di una particolare regione , applica a ZoneId
per ottenere a ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [America / Montreal]
Per generare una stringa formattata, fai come sopra ma sostituisci odt
con zdt
.
String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
14/11/2014 14:05:09
Se esegui questo codice un numero molto elevato di volte, potresti voler essere un po 'più efficiente ed evitare la chiamata a String::replace
. La caduta di quella chiamata rende anche il tuo codice più breve. Se lo desideri, specifica il tuo modello di formattazione nel tuo DateTimeFormatter
oggetto. Cache questa istanza come costante o membro per il riutilizzo.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ); // Data-loss: Dropping any fractional second.
Applica quel formattatore passando l'istanza.
String output = zdt.format( f );
Informazioni su java.time
Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantano le classi data-ora vecchi problematici, come java.util.Date
, .Calendar
, e java.text.SimpleDateFormat
.
Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione a java.time.
Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni.
Gran parte della funzionalità java.time è trasferita su Java 6 e 7 in ThreeTen-Backport e ulteriormente adattata ad Android in ThreeTenABP (vedi Come usare ... ).
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time.