Pièces en option dans SimpleDateFormat
Je suis en train de lire la date de chaînes de caractères qui peut être avec ou sans ajustement de fuseau horaire: yyyyMMddHHmmssz
ou yyyyMMddHHmmss
. Lorsqu'une chaîne est manquant une zone, je vais la traiter comme GMT. Je ne vois pas de toute façon de créer des sections facultatives dans un SimpleDateFormat
, mais peut-être que je suis absent quelque chose. Est-il un moyen de le faire avec un SimpleDateFormat
, ou devrais-je écrire une nouvelle en béton DateFormat
gérer cela?
- Devrait avoir mentionné - c'est une exigence qu'il y ait seulement un DateFormat objet en question ici, parce que je suis de passage dans une bibliothèque qui va les utiliser pour la mise en forme.
- Similaire: stackoverflow.com/questions/4515023/...
- Pour info, le gênants vieille date-heure classes telles que
java.util.Date
,java.util.Calendar
, etjava.text.SimpleDateFormat
sont maintenant héritage, supplantée par la java.de temps les classes intégré dans Java 8 & Java 9. Voir Tutoriel Oracle.
Vous devez vous connecter pour publier un commentaire.
Je voudrais créer deux SimpleDateFormat, l'une avec un fuseau horaire et l'autre sans. Vous pouvez regarder la longueur de la Chaîne pour déterminer lequel utiliser.
Sonne comme vous avez besoin d'un DateFormat qui délègue à deux SDF.
JSR 310 a été livré avec Java 8 qui prend en charge améliorée pour l'analyse temporelle des valeurs où les composants peuvent maintenant être facultatif. Non seulement pouvez-vous faire de la zone facultatif, mais vous pouvez aussi prendre le temps de composants en option et le bon temporelle de l'unité de la chaîne.
Envisager la suite de cas de test.
Ici la DateTimeFormatter modèle de
"yyyy-MM-dd[[ ]['T']HH:mm[:ss][XXX]]"
permet d'options à l'intérieur de la place des parenthèses qui peut également être imbriquées. Les modèles peuvent également être construits à partir d'un DateTimeFormatterBuilder, dont le schéma ci-dessus est démontré ici:Ce serait traduit en une expression qui ressemble à la suivante:
Valeurs facultatives peuvent être imbriquées et sont également automatiquement fermée à la fin si elle est encore ouverte. À noter toutefois qu'il n'existe aucun moyen de fournir un OU exclusif sur les pièces en option, donc le format ci-dessus serait effectivement analyser la valeur suivante assez fine:
Note la vraiment bien la capacité que l'on peut réutiliser le formateur est aussi parties de notre forme actuelle.
.optionalStart()
une erreur?yyyy-MM-dd[[' ']['T']HH:mm[':'ss[.SSS]]]
. Les valeurs facultatives peuvent être imbriqués, ils sont également automatiquement fermée à la fin si elle est encore ouverte.Je sais que c'est un vieux post mais juste pour le record...
Apache DateUtils classe peut vous aider avec ça.
Lien vers le Apache Commons Lang de la bibliothèque dans le repository Maven, vous pouvez vérifier quelle est la version la plus récente:
http://mvnrepository.com/artifact/org.apache.commons/commons-lang3
Maven v3.4
Gradle v3.4
DateUtils.parseDate
méthode concernant les fuseaux horaires. Elle a gardé réglage de l'heure qu'elle analysée que si j'ai lu la date au format UTC heure, alors qu'en fait, je l'ai lu dans l'heure locale.08:43:53.594+0200
mais quand je l'ai interrogé l'analyse de l'objet date, il avait6
pour le champ heure.Si vous pouvez utiliser Joda Datetime il supporte les pièces en option dans le module de formatage, par exemple, "yyyy-MM-dd [hh:mm:ss]"
Je boucle sur la liste des potentiels
DateFormat
objets à l'aide d'untry-catch
opération de briser la boucle sur le succès de la première analyse.Vous pouvez créer deux
SimpleDateFormats
commeJ'ai résolu un problème similaire il y a quelques temps par l'extension de SimpleDateFormat. Ci-dessous un brut de mise en œuvre de montrer l'idée de ma solution. Il peut ne pas être totalement complet/optimisé.
L'essentiel est que vous devez vérifier la chaîne d'entrée et de "deviner" en quelque sorte que le TZ champ est absent, l'ajouter dans l'affirmative, puis laissez le
SimpleDateFormat#parse(String, ParsePosition)
faire le reste. La mise en œuvre ci-dessus n'est pas de mise à jour ParsePosition selon le contrat dans la javadoc dansSimpleDateFormat#parse(String, ParsePosition)
La classe a un seul défaut ctor comme il n'y a qu'un seul format autorisé.
La méthode
MySimpleDateFormat#parse(String, ParsePosition)
est invoquée parSimpleDateFormat#parse(String)
il est donc suffisant pour couvrir les deux cas.L'exécution de la méthode main() c'est la sortie (comme prévu)