web-dev-qa-db-fra.com

Quel est ce format de date? 2011-08-12T20: 17: 46.384Z

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

Java.text.ParseException: date imparable: "2011-08-12T20: 17: 46.384Z"

Je pense que je devrais utiliser SimpleDateFormat pour l'analyse, mais je dois d'abord connaître la chaîne de formatage. Jusqu'ici, tout ce que j'ai à faire pour cela est yyyy-MM-dd, car je ne sais pas ce que signifie T dans cette chaîne - quelque chose lié au fuseau horaire? Cette chaîne de date provient de la balise lcmis:downloadedOn indiquée sur Fichiers type de média de l'historique de téléchargement CMIS .

234
Sarah Vessels

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 appelé "heure zoulou" (UTC). Si vos chaînes always ont 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 en utilisant Joda Time , vous pouvez utiliser ISODateTimeFormat.dateTime() .

325
Jon Skeet

tl; dr

Le format standard ISO 8601 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 appropriée, ISO 8601 .

T sépare la partie date du moment de la journée. La Z à la fin signifie UTC (c'est-à-dire, un décalage par rapport au UTC de zéro heure-minutes-secondes). La Z est prononcé «zoulou»

Java.time

Les anciennes classes date-heure regroupées avec les premières versions de Java se sont révélées mal conçues, confuses et gênantes. Évite-les.

Utilisez plutôt le framework Java.time intégré à Java 8 et versions ultérieures. Les classes Java.time supplantent les anciennes classes date-heure et la très performante bibliothèque Joda-Time. 

Les classes Java.time utilisent ISO 8601 par défaut pour analyser/générer des représentations textuelles de valeurs date-heure.

La classe Instant représente un moment sur la ligne temporelle dans UTC avec une résolution de nanosecondes . Cette classe peut analyser directement votre chaîne d'entrée sans se soucier de définir un modèle de formatage. 

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

À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes héritées _ date-heure telles que Java.util.Date , Calendar _, & SimpleDateFormat .

Le projet Joda-Time , désormais en mode { mode maintenance }, conseille la migration vers les classes Java.time .

Pour en savoir plus, consultez le Oracle Tutorial . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Où obtenir les classes Java.time? 

  • Java SE 8 , Java SE 9 et versions ultérieures
    • Intégré. 
    • Une partie de l'API Java standard avec une implémentation fournie.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité Java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android
    • Les versions ultérieures d'Android regroupent des implémentations des classes Java.time.
    • Pour les versions antérieures d'Android, le projet ThreeTenABP s'adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP… .

Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval _, YearWeek , YearQuarter _ et plus _.

31
Basil Bourque

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

24
smparkes

Il y a d'autres moyens de l'analyser que la première réponse. Pour l'analyser:

(1) Si vous souhaitez récupérer des informations sur la date et l'heure, vous pouvez les analyser dans un objet ZonedDatetime (depuis Java 8 ) ou Date (ancien):

// 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, 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");
3
VeryLazyBoy

Cette technique traduit Java.util.Date au format UTC (ou à un autre) et vice-versa.

Définissez une classe comme suit:

import Java.util.Date;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class UtcUtility {

public static DateTimeFormatter UTC = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZoneUTC();


public static Date parse(DateTimeFormatter dateTimeFormatter, String date) {
    return dateTimeFormatter.parseDateTime(date).toDate();
}

public static String format(DateTimeFormatter dateTimeFormatter, Date date) {
    return format(dateTimeFormatter, date.getTime());
}

private static String format(DateTimeFormatter dateTimeFormatter, long timeInMillis) {
    DateTime dateTime = new DateTime(timeInMillis);
    String formattedString = dateTimeFormatter.print(dateTime);
    return formattedString;
}

}

Ensuite, utilisez-le comme ceci:

Date date = format(UTC, "2020-04-19T00:30:07.000Z")

ou

String date = parse(UTC, new Date())

Vous pouvez également définir d'autres formats de date si vous en avez besoin (pas uniquement en UTC).

0
Gapmeister66

Vous pouvez utiliser l'exemple suivant.

    String date = "2011-08-12T20:17:46.384Z";

    String inputPattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";

    String outputPattern = "yyyy-MM-dd HH:mm:ss";

    LocalDateTime inputDate = null;
    String outputDate = null;


    DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(inputPattern, Locale.ENGLISH);
    DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(outputPattern, Locale.ENGLISH);

    inputDate = LocalDateTime.parse(date, inputFormatter);
    outputDate = outputFormatter.format(inputDate);

    System.out.println("inputDate: " + inputDate);
    System.out.println("outputDate: " + outputDate);
0
Salih Kesepara