Comment obtenir le moment actuel au format ISO 8601 avec la date, l'heure et la minute?

Quelle est la façon la plus élégante d'obtenir ISO 8601 Présentation formatée du moment actuel, UTC? Il devrait ressembler à: 2010-10-12T08:50Z.

255
demandé sur oberlies 2010-10-12 16:00:44

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.

236
répondu Joachim Sauer 2016-06-29 16:07:38

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)

207
répondu Carlos Heuberger 2016-09-15 17:01:41

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".

112
répondu aioobe 2017-09-05 18:22:40

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 comme Instant ou LocalDateTime, mais ils manquent de support de formateur ou de données de fuseau horaire. Seulement ZonedDateTime 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.

98
répondu Sheepy 2018-04-24 09:30:41

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());
25
répondu Jigar Joshi 2018-03-09 00:32:23

À 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.

24
répondu Владимир Зайцев 2018-05-07 15:27:00

DateFormatUtils d'Apache commons-lang3 ont des constantes utiles, par exemple: DateFormatUtils.ISO_DATETIME_FORMAT

20
répondu yegor256 2014-07-17 16:53:37

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.

18
répondu Matthew Buckett 2012-07-10 16:04:50

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'");
15
répondu okwap 2014-04-08 16:54:42

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.

8
répondu Basil Bourque 2018-06-07 21:40:10

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);
7
répondu d.danailov 2014-04-08 14:22:49

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.

5
répondu always_a_rookie_to_learn 2015-11-04 22:04:45

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

5
répondu Tuncay Göncüoğlu 2017-09-08 12:57:42

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());
    }
}
2
répondu gilbertpilz 2012-11-14 15:39:03

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.

1
répondu joão tiago viegas 2015-12-08 14:44:37

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.

1
répondu Gerardo Suarez 2017-06-23 16:35:57
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());
}
1
répondu cprcrack 2017-09-28 07:26:21

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.

1
répondu Basil Bourque 2018-05-04 23:36:15

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

0
répondu Christophe Roussy 2018-04-03 12:38:58
DateTimeFormatter.ISO_DATE_TIME
        .withZone(ZoneOffset.UTC)
        .format(yourDateObject.toInstant())
0
répondu apen 2018-04-27 03:08:39

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

-3
répondu Surej 2011-12-21 13:11:17