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 .
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()
.
Le format standard ISO 8601 est utilisé par votre chaîne d'entrée.
Instant.parse ( "2011-08-12T20:17:46.384Z" )
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» .
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" ) ;
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?
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 _.
Pas sûr de l'analyse Java, mais c'est ISO8601: http://en.wikipedia.org/wiki/ISO_8601
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");
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).
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);