Comment obtenir le moment actuel au format ISO 8601 avec la date, l'heure et la minute?
21 réponses
Utiliser SimpleDateFormat
pour formater une Date
objet que vous souhaitez:
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
L'utilisation d'un {[3] } comme indiqué ci-dessus formatera l'heure actuelle.
Pour les systèmes où le fuseau horaire par défaut N'est pas UTC:
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
L'instance SimpleDateFormat
peut être déclarée comme constante globale si nécessaire fréquemment, mais attention que cette classe n'est pas sécurisée par les threads. Il doit être synchronisé s'il est accessible simultanément par plusieurs threads.
EDIT: je préférerais Joda Time si je fais plusieurs manipulations de temps/Date différentes...
EDIT2: corrected: setTimeZone
n'accepte pas une chaîne (corrigée par Paul)
Java 8:
thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX")
.withZone(ZoneOffset.UTC)
.format(Instant.now());
Pré Java 8:
thisMoment = String.format("%tFT%<tRZ",
Calendar.getInstance(TimeZone.getTimeZone("Z")));
À partir de les documents:
'R'
Heure formatée pour l'horloge de 24 heures comme "% tH: % tM"'F'
ISO 8601 date complète formatée comme "% tY - % tm - % td".
Java 8 Natif
Java.time le rend simple depuis Java 8. Et thread-safe.
ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )
Résultat: 2015-04-14T11:07:36.639Z
, Vous pouvez être tenté d'utiliser un briquet
Temporal
commeInstant
ouLocalDateTime
, mais ils manquent de support de formateur ou de données de fuseau horaire. SeulementZonedDateTime
fonctionne hors de la boîte.
En réglant ou en enchaînant les options / opérations de ZonedDateTime et DateTimeFormatter, Vous pouvez facilement contrôler le timezone et Précision , dans une certaine mesure:
ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
.truncatedTo( ChronoUnit.MINUTES )
.format( DateTimeFormatter.ISO_DATE_TIME )
Résultat: 2015-04-14T11:07:00+01:00[Europe/Paris]
Les exigences raffinées, telles que la suppression de la partie secondes, doivent toujours être servies par des formats personnalisés ou un processus de post personnalisé.
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // 2015-04-14T11:07:00
.format( DateTimeFormatter.ISO_LOCAL_DATE ) // 2015-04-14
.format( DateTimeFormatter.ISO_LOCAL_TIME ) // 11:07:00
.format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm" ) ) // 2015-04-14 11:07
Pour Java 6 & 7, vous pouvez considérer les ports arrière de java.temps comme ThreeTen-Backport , qui a également un Port Android . Les deux sont plus légers que Joda, et a appris de L'expérience de Joda - esp. considérant que java.le temps est conçu par l'auteur de Joda.
Utiliser JodaTime
Le système de calendrier ISO 8601 est l'implémentation par défaut dans Joda-Time
Ici est le doc pour JodaTime Formateur
Modifier:
Si vous ne voulez pas ajouter ou si vous ne voyez pas la valeur de l'ajout de la bibliothèque ci-dessus, vous pouvez simplement utiliser la classe SimpleDateFormat
intégrée pour formater la Date au format ISO requis
Comme suggéré par @ Joachim Sauer
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());
À partir de Java 8, Vous pouvez simplement faire:
Instant.now().toString();
À Partir de la java.time.Instant
docs:
Maintenant
public static Instant now()
Obtient l'instant courant à partir de l'horloge système.
Cela va interroger l'horloge UTC Système pour obtenir l'instant courant.
ToString
public String toString()
Une représentation de chaîne de cet instant en utilisant la représentation ISO-8601.
, Le format utilisé est le même que
DateTimeFormatter.ISO_INSTANT
.
DateFormatUtils d'Apache commons-lang3
ont des constantes utiles, par exemple: DateFormatUtils.ISO_DATETIME_FORMAT
Si vous ne voulez pas inclure Jodatime (aussi beau que c'est)
javax.xml.bind.DatatypeConverter.printDateTime(
Calendar.getInstance(TimeZone.getTimeZone("UTC"))
);
Qui renvoie une chaîne de:
2012-07-10T16:02:48.440Z
Qui est légèrement différent de la requête d'origine mais est toujours ISO-8601.
ISO 8601 peut contenir des secondes voir http://en.wikipedia.org/wiki/ISO_8601#Times
Donc le code devrait être
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
Joda-Temps
Mise à jour: Le Projet Joda-Time est maintenant en mode de maintenance , l'équipe conseillant la migration vers le java .temps classes. Pour Java 6 et 7, Voir le ThreeTen-Backport projet, encore adapté pour Android dans le Troisetenabp projet.
Utilisation de la bibliothèqueJoda-Time ...
String output = new DateTime( DateTimeZone.UTC ).toString() ;
Ceci est thread-safe. Joda-Time crée de nouveaux objets immuables plutôt que de changer des objets existants.
Si vous avez vraiment l'intention de demander un format sans secondes, en résolvant en minutes, utilisez l'un des nombreux autres formateurs intégrés dans Joda-Time.
DateTime now = new DateTime( DateTimeZone.UTC ) ;
String output = ISODateTimeFormat.dateHourMinute.print( now ) ;
Java.temps
Pour Java 8 et versions ultérieures, Joda-Time continue de fonctionner. Mais le java intégré .temps cadre remplace Joda-temps. Alors migrez votre code de Joda-Time vers java.le temps dès qu'il est commode.
Voir mon autre Réponse moderne solution.
À propos de java.temps
Le java.heure framework est intégré à Java 8 et versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date-heure classes telles que java.util.Date
, Calendar
, & SimpleDateFormat
.
Le Joda-Temps projet, maintenant en mode de maintenance , conseille la migration vers le java .temps classes.
Pour en savoir plus, consultez Tutoriel Oracle. Et recherchez le débordement de pile pour de nombreux exemples et explications. La spécification est JSR 310 .
, Vous pouvez échanger java.temps objets directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou une version ultérieure. Pas besoin de Chaînes, pas besoin de classes java.sql.*
.
Où obtenir le java.les classes de temps?
-
Java SE 8, Java SE 9, Java SE 10, et plus tard
- intégré.
- fait partie de L'API Java standard avec une implémentation groupée.
- Java 9 ajoute quelques fonctionnalités et corrections mineures.
-
Java SE 6 et Java SE 7
- une grande partie de java.la fonctionnalité time est de nouveau portée sur Java 6 et 7 dans ThreeTen-Backport.
-
Android
- les versions ultérieures des implémentations bundle Android de java.les classes de temps.
- pour Android plus tôt (Troisetenabp le projet adapte ThreeTen-Backport (mentionné ci-dessus). Tu vois Comment utiliser ThreeTenABP....
Le ThreeTen-Extra le projet s'étend java.temps avec des classes supplémentaires. Ce projet est un terrain d'essai pour les futurs ajouts possibles à java.temps. Vous pouvez trouver quelques classes utiles ici comme Interval
, YearWeek
, YearQuarter
, et plus.
Pour Java version 7
Vous pouvez suivre la documentation Oracle: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
X-est utilisé pour le fuseau horaire ISO 8601
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
System.out.println(nowAsISO);
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
//nowAsISO = "2013-05-31T00:00:00Z";
Date finalResult = df1.parse(nowAsISO);
System.out.println(finalResult);
Vous pouvez utiliser SimpleDateFormat de Java avec le modèle suivantyyyy-MM-dd'T'HH:mm:ssXXX
pour ISO 8601.
Exemple de Code: (liste pour tous les fuseaux horaires disponibles)
for (String timeZone : TimeZone.getAvailableIDs())
{
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
String formatted = dateFormat.format(new Date());
System.out.print(formatted);
if (formatted.endsWith("Z"))
{
// These time zone's have offset of '0' from GMT.
System.out.print("\t(" + timeZone + ")");
}
System.out.println();
}
, Vous pouvez utiliser:
Fuseau horaire.getDefault ()
Pour le fuseau horaire de la machine virtuelle par défaut. Plus de ici
Vous remarquerez peut-être l'Heure de la date pour quelques fuseaux horaires qui se terminent par 'Z'
. Ces fuseaux horaires ont un décalage de {[3] } par rapport à GMT.
Plus les informations peuvent être trouvées ici.
Je crois que le moyen le plus simple est d'abord d'aller à instant, puis à string comme:
String d = new Date().toInstant().toString();
Qui se traduira par:
2017-09-08T12:56:45.331Z
Voici toute une classe optimisée pour que l'appel de "now ()" ne fasse rien de plus qu'il doit faire.
public class Iso8601Util
{
private static TimeZone tz = TimeZone.getTimeZone("UTC");
private static DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
static
{
df.setTimeZone(tz);
}
public static String now()
{
return df.format(new Date());
}
}
Pourtant, joda-time ne supporte que le format étendu: "2015-12-09T00: 22: 42.930 Z" pas de base: "20151209T002242. 930Z" ...nous pourrions être mieux de tester une liste de formats avec java SimpleDateFormat.
Je l'ai fait dans Android en utilisant Calendar et SimpleDateFormat. La méthode suivante renvoie un calendrier avec le fuseau horaire " GMT " (c'est le fuseau horaire universel). Ensuite, vous pouvez utiliser la classe Calendar pour définir l'heure entre les différents fuseaux horaires, en utilisant la méthode setTimeZone() de la classe Calendar.
private static final String GMT = "GMT";
private static final String DATE_FORMAT_ISO = "yyyyMMdd'T'HHmmss";
public static Calendar isoToCalendar(final String inputDate) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT));
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_ISO, Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone(GMT));
Date date = dateFormat.parse(inputDate);
calendar.setTime(date);
} catch (ParseException e) {
Log.e("TAG",e.getMessage());
}
return calendar;
}
Rappelez-vous: La classe Date ne connaît pas l'existence du fuseau horaire. Par cette raison, si vous déboguez un jour,vous voyez toujours la date de votre fuseau horaire actuel.
private static String getCurrentDateIso()
{
// Returns the current date with the same format as Javascript's new Date().toJSON(), ISO 8601
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
return dateFormat.format(new Date());
}
Tl; dr
Certains des autres Réponses sont correctes, en recommandant java.time classes mais utilisez des longueurs inutiles pour vos besoins spécifiques.
Instant.now() // Capture the current moment in UTC with a resolution as fines nanoseconds but usually in microseconds or milliseconds.
.truncatedTo( ChronoUnit.MINUTES ) // Lop off any seconds or fractional second, to get a value in whole minutes.
.toString() // Generate a String in standard ISO 8601 format where a `T` separates the year-month-day from the hour-minute-second, and the `Z` on the end for “Zulu” means UTC.
2018-01-23T12: 34Z
Instant::toString
La classe jav.time.Instant
représente un moment en UTC, toujours en UTC.
Instant instant = Instant.now() ;
Éphémère.toString(): 2018-01-23T12:34:56.123456 Z
Le Z
à la fin de votre chaîne d'exemple {[6] } est prononcé "Zulu" et signifie UTC .
Le format souhaité est conforme à la normeISO 8601 . Le java.les classes time utilisent ces formats standard par défaut lors de l'analyse/génération de chaînes. Donc pas besoin de spécifier le format. Appelez simplement Instant::toString
comme vu ci-dessus.
Si vous voulez spécifiquement des minutes entières sans seconde ou fraction de seconde, alors tronquez. Spécifiez une unité de temps via ChronoUnit
classe.
Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ;
String output = instant.toString(); // Generate a `String` object in standard ISO 8601 format.
À propos java.temps
Le java.heure framework est intégré à Java 8 et versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date-heure classes telles que java.util.Date
, Calendar
, & SimpleDateFormat
.
Le Joda-Temps le projet, maintenant en mode de maintenance , conseille la migration vers le java .temps classes.
Pour en savoir plus, consultez les Oracle Tutoriel. Et recherche Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
, Vous pouvez échanger java.temps objets directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou une version ultérieure. Pas besoin de Chaînes, pas besoin de classes java.sql.*
.
Où obtenir le java.les classes de temps?
-
Java SE 8, Java SE 9, Java SE 10, et tard
- intégré.
- fait partie de L'API Java standard avec une implémentation groupée.
- Java 9 ajoute quelques fonctionnalités et corrections mineures.
-
Java SE 6 et Java SE 7
- une grande partie de java.la fonctionnalité time est de nouveau portée sur Java 6 et 7 dans ThreeTen-Backport.
-
Android
- versions ultérieures de Implémentations bundle Android de java.les classes de temps.
- pour Android plus tôt (Troisetenabp le projet adapte ThreeTen-Backport (mentionné ci-dessus). Tu vois Comment utiliser ThreeTenABP....
Le ThreeTen-Extra le projet s'étend java.temps avec des classes supplémentaires. Ce projet est un terrain d'essai pour les futurs ajouts possibles à java.temps. Vous pouvez trouver quelques classes utiles ici comme Interval
, YearWeek
, YearQuarter
, et plus.
Ils auraient dû ajouter une sorte de moyen simple de passer de la Date à L'Instant et aussi une méthode appelée toISO8601
, ce que beaucoup de gens recherchent.
En complément d'autres réponses, à partir d'un java.util.Date au format ISO 8601:
Instant.ofEpochMilli(date.getTime()).toString();
Ce n'est pas vraiment visible lors de l'utilisation de l'auto-complétion mais:
java.time.Instant.toString()
:
Une représentation de chaîne de cet instant en utilisant ISO-8601
DateTimeFormatter.ISO_DATE_TIME
.withZone(ZoneOffset.UTC)
.format(yourDateObject.toInstant())
Essayez Ceci,
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ");
String date=sdf.format (new Date() );
Son pour ISO 8601 format