Qu'est-ce que ce format de date? 2011-08-12T20: 17: 46.384 Z

J'ai la date suivante: 2011-08-12T20:17:46.384Z. Ce format est-ce? J'essaie de l'analyser avec Java 1.4 via DateFormat.getDateInstance().parse(dateStr) et je reçois

Java.texte.ParseException: Unparseable date: "2011-08-12T20: 17: 46.384 Z"

Je pense que je devrais utiliser SimpleDateFormat pour l'analyse, mais je dois d'abord connaître la chaîne de format. Tout ce que j'ai pour cela jusqu'à présent est yyyy-MM-dd, parce que je ne sais pas ce que le T signifie dans cette chaîne-quelque chose de lié au fuseau horaire? Cette chaîne de date est provenant de la balise lcmis:downloadedOn affichée sur fichiers CMIS télécharger l'historique type de support .

189
demandé sur Sarah Vessels 2011-12-06 22:45:57

5 réponses

Le T est juste un littéral pour séparer la date de l'heure, et le Z signifie "décalage horaire zéro" également connu sous le nom de" temps Zoulou " (UTC). Si vos chaînes ont toujours Un "Z", Vous pouvez utiliser:

SimpleDateFormat format = new SimpleDateFormat(
    "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));

Ou à l'aide de Joda Time, vous pouvez utiliser ISODateTimeFormat.dateTime().

279
répondu Jon Skeet 2016-11-13 07:41:31

Tl; dr

Norme ISO 8601 le format est utilisé par votre chaîne d'entrée.

Instant.parse ( "2011-08-12T20:17:46.384Z" ) 

ISO 8601

Ce format est défini par la norme pratique sensible, ISO 8601 .

Le T sépare la partie date de la partie heure du jour. Le Z à la fin est l'abréviation de Zulu et signifie UTC .

Java.temps

Les anciennes classes date-heure fournies avec les premières versions de Java se sont avérées être mal conçu, déroutant et gênant. Les éviter.

À la place, utilisez le java.TIME cadre intégré à Java 8 et versions ultérieures. Java.les classes de temps supplantent à la fois les anciennes classes de date-heure et la bibliothèque Joda-Time très réussie.

Le java.les classes de temps utilisent ISO 8601 par défaut lors de l'analyse/génération de représentations textuelles des valeurs date-heure.

Le Instant la classe représente un moment dans le scénario de UTC, avec un la résolution de nanosecondes. Cette classe peut directement analyser votre chaîne d'entrée sans prendre la peine de définir un modèle de formatage.

Instant instant = Instant.parse ( "2011-08-12T20:17:46.384Z" ) ;

À 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 dans mode de maintenance , conseille la migration vers le java.temps classes.

Pour en savoir plus, consultez les Oracle Tutoriel. Et recherchez le débordement de pile pour de nombreux exemples et explications. La spécification est JSR 310 .

Où obtenir le java.les classes de temps?

  • Java SE 8, Java SE 9, et plus tard
    • intégré.
    • fait partie de L'API Java standard avec un 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 plus tôt Android, le 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.

27
répondu Basil Bourque 2018-04-03 00:48:00

Pas sûr de L'analyse Java, mais c'est ISO8601: http://en.wikipedia.org/wiki/ISO_8601

22
répondu smparkes 2011-12-06 18:48:39

Il existe d'autres façons de l'analyser plutôt que la première réponse. Pour l'analyser:

(1) Si vous souhaitez obtenir des informations sur la date et l'heure, vous pouvez l'analyser pour un ZonedDatetime(depuis Java 8) ou Date(vieux) objet:

// ZonedDateTime's default format requires a zone ID(like [Australia/Sydney]) in the end.
// Here, we provide a format which can parse the string correctly.
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
ZonedDateTime zdt = ZonedDateTime.parse("2011-08-12T20:17:46.384Z", dtf);

Ou

// 'T' is a literal.
// 'X' is ISO Zone Offset[like +01, -08]; For UTC, it is interpreted as 'Z'(Zero) literal.
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX";

// since no built-in format, we provides pattern directly.
DateFormat df = new SimpleDateFormat(pattern);

Date myDate = df.parse("2011-08-12T20:17:46.384Z");

(2) Si vous ne vous souciez pas de la date et de l'heure et que vous voulez juste traiter l'information comme un moment en nanosecondes, alors vous pouvez utiliser Instant:

// The ISO format without zone ID is Instant's default.
// There is no need to pass any format.
Instant ins = Instant.parse("2011-08-12T20:17:46.384Z");
1
répondu VeryLazyBoy 2018-04-27 08:10:44

Le moyen facile de résoudre ce problème est de remplacer la "T" avec " " et supprimer .384Z.

Voici une illustration de la façon d'y parvenir:

public static String getTime(String time) {
    if (time != null) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        if (time.toUpperCase().contains("T") && time.toUpperCase().contains("Z")) {
            time = time.toUpperCase().replace("T", " ");
            String[] str = time.split("\\.");

            if (str.length != 0) {
                return str[0];
            }
        }

        try {
            Date date = new Date(time);
            time = simpleDateFormat.format(date);
        } catch (Exception e) {
        //
        }
    }
    return time;
}
-9
répondu taken2016 2016-11-12 12:48:58