J'essaie de convertir un ISO 8601 vers une chaîne de caractères formatée java.util.Date
.
J'ai trouvé le modèle yyyy-MM-dd'T'HH:mm:ssZ
pour être conforme à la norme ISO8601 s'il est utilisé avec une Locale (comparer l'exemple).
Cependant, l'utilisation du java.text.SimpleDateFormat
je ne peux pas convertir la chaîne correctement formatée 2010-01-01T12:00:00+01:00
. Je dois d'abord le convertir en 2010-01-01T12:00:00+0100
sans les deux points.
La solution actuelle est donc
SimpleDateFormat ISO8601DATEFORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.GERMANY);
String date = "2010-01-01T12:00:00+01:00".replaceAll("\\+0([0-9]){1}\\:00", "+0$100");
System.out.println(ISO8601DATEFORMAT.parse(date));
ce qui n'est évidemment pas si agréable. Est-ce que je rate quelque chose ou existe-t-il une meilleure solution ?
Réponse :
Grâce au commentaire de JuanZe, j'ai trouvé l'adresse suivante Joda-Time magique, c'est aussi décrit ici .
Donc, la solution est
DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis();
String jtdate = "2010-01-01T12:00:00+01:00";
System.out.println(parser2.parseDateTime(jtdate));
Ou plus simplement, utilisez le parseur par défaut via le constructeur :
DateTime dt = new DateTime( "2010-01-01T12:00:00+01:00" ) ;
Pour moi, c'est bien.
276 votes
Préparez-vous à recevoir beaucoup de réponses "Utilisez JodaTime"...
0 votes
Oh, j'adore JodaTime - mais je ne savais pas qu'il pouvait m'aider ici.....
0 votes
Avez-vous essayé différentes langues ? Je me demande s'il ne s'agit pas d'un bogue spécifique à la locale en ce qui concerne l'analyse des fuseaux horaires.
3 votes
@Ice09 : Si la documentation API pour DateTimeFormat est correcte (la documentation JoDa peut être trompeuse, erronée ou incomplète), le modèle que vous avez utilisé dans votre propre "réponse" n'est pas compatible avec ISO8601.
0 votes
@jarnbjo : merci pour le commentaire - vous avez peut-être raison, j'ai regardé à nouveau et j'ai trouvé la bien meilleure solution ISODateTimeFormat.dateTimeNoMillis(), qui garantit en quelque sorte que le format correct est utilisé.
0 votes
Voir : stackoverflow.com/questions/1554852/ y stackoverflow.com/questions/2580925/simpledateformat-parsing y stackoverflow.com/questions/4013681/ y
24 votes
Je ne sais pas quand cela a été ajouté, mais le "X" semble résoudre ce problème dans SimpleDateFormat. Le modèle "yyyy-MM-dd'T'HH:mm:ssX" analyse avec succès l'exemple de la question.
12 votes
Le "X" est disponible depuis Java 7.
1 votes
La réponse intégrée avec Joda-Time peut être beaucoup plus court, une seule ligne de code, sans avoir besoin d'appeler la méthode parse :
new DateTime( "2010-01-01T12:00:00+01:00" )
. Voir ma réponse pour les détails.0 votes
J'ai trouvé une réponse qui a fonctionné pour moi sur [cette réponse particulière][1]. [1] : stackoverflow.com/a/10615059/2413303
4 votes
Java 8 vous facilite la tâche ! Il y a un joyau caché par Adam dans les réponses ci-dessous : stackoverflow.com/a/27479533/1262901
0 votes
@JuanZe L'idée d'ajouter une énorme bibliothèque pour une seule fonction dans mon application me frustre aussi Merci pour le commentaire.
0 votes
Joda DateTime ne supportait pas 20190531T194819Z(yyyyMMdd'T'HHmmssSSS'Z') exemple du fr.wikipedia.org/wiki/ISO_8601 et donc ajouté la solution ci-dessous : stackoverflow.com/questions/2201925/
0 votes
Apache Jackrabbit utilise le format ISO 8601 pour conserver les dates, et il existe une classe d'aide pour les analyser : org.apache.jackrabbit.util.ISO8601 Livré avec jackrabbit-jcr-commons .