J'ai la date suivante: 2011-08-12T20:17:46.384Z
. De quel format s'agit-il? J'essaie de l'analyser avec Java 1.4 via DateFormat.getDateInstance().parse(dateStr)
et je reçois
java.text.ParseException: Date non comparable: "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 format. Tout ce que j'ai pour le moment, c'est yyyy-MM-dd
parce que je ne sais pas ce que T
signifie cette chaîne - quelque chose de fuseau horaire? Cette chaîne de date provient de la lcmis:downloadedOn
balise affichée sur le type de support de l'historique des téléchargements CMIS Fichiers .
Z
à la fin est l'abréviation deZulu
et signifie UTC . Ce format certainement est une partie de la norme ISO 8601 collection des formats de texte date-heure standard. Par ailleurs, ces formats standard sont utilisés par défaut dans les classes java.time .java.util.Date
,java.util.Calendar
etjava.text.SimpleDateFormat
sont désormais héritées , supplantées par les classes java.time intégrées à Java 8 et Java 9. Voir Tutorial by Oracle .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 comme "heure zoulou" (UTC). Si vos chaînes ont toujours un "Z", vous pouvez utiliser:
Ou en utilisant Joda Time , vous pouvez utiliser
ISODateTimeFormat.dateTime()
.la source
T
etZ
?T
(je ne me souviens pas comment SimpleDateFormat gère les spécificateurs inconnus) mais pourZ
nous voulons que ce soit le caractère 'Z' plutôt que "une valeur de décalage UTC" (par exemple "00").tl; dr
Le format ISO 8601 standard est utilisé par votre chaîne d'entrée.
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. L'Z
extrémité signifie UTC (c'est-à-dire un décalage par rapport à UTC de zéro heure-minute-seconde). LeZ
se prononce «zoulou» .java.time
Les anciennes classes de date-heure regroupées avec les premières versions de Java se sont avérées mal conçues, déroutantes 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 à la fois les anciennes classes date-heure et la bibliothèque Joda-Time très réussie.
Les classes java.time utilisent ISO 8601 par défaut lors de l'analyse / génération de représentations textuelles de valeurs date-heure.
La
Instant
classe représente un moment sur la timeline en 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.À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que
java.util.Date
,Calendar
, etSimpleDateFormat
.Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Pour en savoir plus, consultez le didacticiel Oracle . 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 de futurs ajouts possibles à java.time. Vous trouverez peut - être des classes utiles ici, comme
Interval
,YearWeek
,YearQuarter
et plus .la source
Pas sûr de l'analyse Java, mais c'est ISO8601: http://en.wikipedia.org/wiki/ISO_8601
la source
Il existe d'autres façons de l'analyser plutôt 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 l'analyser vers un objet
ZonedDatetime
(depuis Java 8 ) ouDate
(ancien):ou
(2) Si vous ne vous souciez pas de la date et de l'heure et que vous souhaitez simplement traiter les informations comme un instant en nanosecondes, vous pouvez utiliser
Instant
:la source
Si vous cherchez une solution pour Android, vous pouvez utiliser le code suivant pour obtenir les secondes de l'époque à partir de la chaîne d'horodatage.
Exemple d'entrée: 2019-10-15T05: 51: 31.537979Z
Exemple de sortie: 1571128673
la source
Vous pouvez utiliser l'exemple suivant.
la source
Z
. Cela signifie attendre mais ignorer cette lettre. Mais cette lettre ne doit pas être ignorée. Cette lettre fournit des informations précieuses, le fait que la chaîne était destinée à UTC, un décalage de zéro. Votre format ignore ce fait important. De plus, il n'est même pas nécessaire de prendre la peine de définir ce modèle de formatage. Un formateur pour ce modèle est intégré.Cette technique traduit java.util.Date au format UTC (ou tout autre) et vice-versa.
Définissez une classe comme ceci:
}
Ensuite, utilisez-le comme ceci:
ou
Vous pouvez également définir d'autres formats de date si vous le souhaitez (pas seulement UTC)
la source
java.util.Date
et le Joda-Time projet ont été supplanté il y a quelques années par les modernes java.time classes définies dans JSR 310. Le conseil est dépassée depuis longtemps.@ John-Skeet m'a donné l'indice pour résoudre mon propre problème. En tant que jeune programmeur, ce petit problème est facile à manquer et difficile à diagnostiquer. Donc je le partage dans l'espoir qu'il aidera quelqu'un.
Mon problème était que je voulais analyser la chaîne suivante contenant un horodatage d'un JSON sur lequel je n'ai aucune influence et le mettre dans des variables plus utiles. Mais j'ai continué à recevoir des erreurs.
Donc, étant donné ce qui suit (faites attention au paramètre de chaîne à l'intérieur de Pattern ();
Erreur:
Le problème? Le Z à la fin du motif doit être entouré de «Z» tout comme le «T». Changez
"yyyyMMdd'T'HHmmss.SSSZ"
en"yyyyMMdd'T'HHmmss.SSS'Z'"
et ça marche.La suppression totale du Z du motif a également entraîné des erreurs.
Franchement, je m'attendrais à ce qu'une classe Java ait anticipé cela.
la source
T
est un littéral et doit être cité,Z
est un décalage (de zéro) et doit être analysé en tant que tel, sinon vous obtiendrez des résultats erronés. Je ne sais pas ce que vous voulez dire par anticipation, je crois que oui.Z
. Vous jetez des informations précieuses. Traiter une valeur date-heure tout en ignorant le fuseau horaire ou le décalage par rapport à l'UTC, c'est comme traiter une somme d'argent tout en ignorant la devise!T
sépare simplement la partie date de la partie heure et n'ajoute aucune signification. D'Z
autre part, cela ajoute définitivement du sens.