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.
2014-11-14 14:05:09
java.time
La méthode moderne consiste à utiliser les classes java.time qui supplantent désormais les anciennes classes de date-heure héritées.
Convertissez d'abord votre fichier java.util.Date
en un Instant
. La Instant
classe représente un moment sur la timeline en UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).
Les conversions vers / depuis java.time sont effectuées par de nouvelles méthodes ajoutées aux anciennes classes.
Instant instant = myUtilDate.toInstant();
Les deux votre java.util.Date
et java.time.Instant
sont en UTC . Si vous voulez voir la date et l'heure en UTC, qu'il en soit ainsi. Appelez toString
pour générer une chaîne au format standard ISO 8601 .
String output = instant.toString();
2014-11-14T14: 05: 09Z
Pour les autres formats, vous devez transformer votre Instant
en le plus flexible OffsetDateTime
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
odt.toString (): 2020-05-01T21: 25: 35.957Z
Découvrez ce code en direct sur IdeOne.com .
Pour obtenir une chaîne au format souhaité, spécifiez a DateTimeFormatter
. Vous pouvez spécifier un format personnalisé. Mais j'utiliserais l'un des formateurs prédéfinis ( ISO_LOCAL_DATE_TIME
) et remplacerais le T
dans sa sortie par un ESPACE.
String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
2014-11-14 14:05:09
Soit dit en passant, je ne recommande pas ce type de format où vous perdez volontairement les informations de décalage par rapport à UTC ou de fuseau horaire. Crée une ambiguïté quant à la signification de la valeur date-heure de cette chaîne.
Méfiez-vous également de la perte de données, car toute fraction de seconde est ignorée (effectivement tronquée) dans la représentation de votre chaîne de la valeur date-heure.
Pour voir ce même moment à travers l'objectif de l' heure d'une horloge murale d'une région particulière , appliquez a ZoneId
pour obtenir a ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [Amérique / Montréal]
Pour générer une chaîne formatée, faites la même chose que ci-dessus mais remplacez odt
par zdt
.
String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
2014-11-14 14:05:09
Si vous exécutez ce code un très grand nombre de fois, vous voudrez peut-être être un peu plus efficace et éviter l'appel à String::replace
. La suppression de cet appel raccourcit également votre code. Si vous le souhaitez, spécifiez votre propre modèle de mise en forme dans votre propre DateTimeFormatter
objet. Mettez cette instance en cache en tant que constante ou membre pour la réutiliser.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ); // Data-loss: Dropping any fractional second.
Appliquez ce formateur en passant l'instance.
String output = zdt.format( f );
À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les classes date de temps anciens gênants tels que java.util.Date
, .Calendar
, et java.text.SimpleDateFormat
.
Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers java.time.
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications.
Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport et adaptée à Android dans ThreeTenABP (voir Comment utiliser… ).
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour de futurs ajouts possibles à java.time.