tl; dr
Instant.now() // Capture the current moment in UTC.
Générez une chaîne pour représenter cette valeur:
Instant.now().toString()
2016-09-13T23: 30: 52.123Z
Détails
Comme l'a indiqué la bonne réponse de Jon Skeet , un objet java.util.Date n'a pas de fuseau horaire † . Mais son toString
implémentation applique le fuseau horaire par défaut de la JVM lors de la génération de la représentation String de cette valeur date-heure. Confus pour le programmeur naïf, une date semble avoir un fuseau horaire mais pas.
Les java.util.Date
, j.u.Calendar
et les java.text.SimpleDateFormat
classes avec Java sont notoirement gênants. Évite-les. Utilisez plutôt l'une de ces bibliothèques de date-heure compétentes:
java.time (Java 8)
Java 8 apporte un excellent nouveau package java.time. * Pour remplacer les anciennes classes java.util.Date/Calendar.
Obtenir l'heure actuelle en UTC / GMT est un simple aller simple…
Instant instant = Instant.now();
Cette Instant
classe est le bloc de construction de base dans java.time, représentant un moment sur la timeline en UTC avec une résolution de nanosecondes .
Dans Java 8, l'instant actuel est capturé avec une résolution allant jusqu'à quelques millisecondes seulement. Java 9 apporte une nouvelle implémentation de Clock
capture du moment actuel jusqu'à la pleine capacité en nanosecondes de cette classe, selon la capacité du matériel d'horloge de votre ordinateur hôte.
Sa toString
méthode génère une représentation String de sa valeur en utilisant un format ISO 8601 spécifique . Ce format génère zéro, trois, six ou neuf chiffres ( millisecondes , microsecondes ou nanosecondes ) selon les besoins pour représenter la fraction de seconde.
Si vous souhaitez une mise en forme plus flexible ou d'autres fonctionnalités supplémentaires, appliquez un décalage par rapport à UTC de zéro, pour que l'UTC lui-même ( ZoneOffset.UTC
constant ) obtienne un OffsetDateTime
.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
Dump sur console…
System.out.println( "now.toString(): " + now );
Lors de l'exécution ...
now.toString(): 2014-01-21T23:42:03.522Z
À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date
, Calendar
, et SimpleDateFormat
.
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de java.sql.*
cours.
Où obtenir les classes java.time?
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. Vous trouverez peut - être des classes utiles ici, comme Interval
, YearWeek
, YearQuarter
et plus .
Joda-Time
MISE À JOUR: Le projet Joda-Time , maintenant en mode maintenance , conseille la migration vers les classes java.time .
En utilisant la bibliothèque gratuite et gratuite Joda-Time 3rd-source, vous pouvez obtenir la date-heure actuelle en une seule ligne de code.
Joda-Time a inspiré les nouvelles classes java.time. * De Java 8, mais a une architecture différente. Vous pouvez utiliser Joda-Time dans les anciennes versions de Java. Joda-Time continue de fonctionner dans Java 8 et continue d'être activement entretenu (depuis 2014). Cependant, l'équipe Joda-Time conseille la migration vers java.time.
System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );
Exemple de code plus détaillé (Joda-Time 2.3)…
org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );
Dump sur console…
System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );
Lors de l'exécution ...
Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z
Pour plus d'exemples de code faisant un travail de fuseau horaire, voir ma réponse à une question similaire.
Fuseau horaire
Je vous recommande de toujours spécifier un fuseau horaire plutôt que de vous fier implicitement au fuseau horaire par défaut de la JVM (qui peut changer à tout moment!). Une telle confiance semble être une cause courante de confusion et de bugs dans le travail date-heure.
Lors de l'appel, now()
passez le fuseau horaire souhaité / attendu à attribuer. Utilisez la DateTimeZone
classe.
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );
Cette classe contient une constante pour le fuseau horaire UTC .
DateTime now = DateTime.now( DateTimeZone.UTC );
Si vous voulez vraiment utiliser le fuseau horaire par défaut de la JVM, faites un appel explicite pour que votre code soit auto-documenté.
DateTimeZone zoneDefault = DateTimeZone.getDefault();
ISO 8601
Lisez à propos de l' ISO 8601 formats. Java.time et Joda-Time utilisent les formats sensibles de cette norme comme valeurs par défaut pour l'analyse et la génération de chaînes.
† En fait, java.util.Date ne une zone de temps, enfoui au plus profond sous des couches de code source. Dans la plupart des cas, ce fuseau horaire est ignoré. Donc, en raccourci, nous disons que java.util.Date n'a pas de fuseau horaire. De plus, ce fuseau horaire enfoui n'est pas celui utilisé par la toString
méthode de Date ; cette méthode utilise le fuseau horaire par défaut de la JVM. Raison de plus pour éviter cette classe déroutante et s'en tenir à Joda-Time et java.time.