Comment créeriez-vous par programme un modèle à partir d’une date stockée dans une chaîne ?

StackOverflow https://stackoverflow.com/questions/43842

  •  09-06-2019
  •  | 
  •  

Question

J'ai une chaîne qui contient la représentation d'une date.On dirait:

Jeu. 30 novembre 19:00:00 HNE 2006

J'essaie de créer un objet Date en utilisant SimpleDateFormat et j'ai 2 problèmes.

1.) Je n'arrive pas à comprendre le modèle pour coder en dur la solution dans le constructeur SimpleDateFormat

2.) Je ne trouve pas de moyen d'analyser la chaîne à l'aide de l'API pour déterminer le modèle afin de pouvoir le réutiliser pour différents modèles de sortie de date.

Si quelqu'un connaît une solution utilisant l'API ou une solution personnalisée, je l'apprécierais grandement.

Était-ce utile?

La solution

Le format à transmettre à SimpleDateFormat pourrait être consulté http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy")

Quant à votre deuxième question, je ne connais aucune bibliothèque Java permettant de déterminer un format de date et de l'analyser sans savoir à l'avance quel est ce format.

Autres conseils

L'analyseur de dates POJava org.pojava.datetime.DateTime est un analyseur immuable et robuste qui prend en charge plusieurs langues, fuseaux horaires et formats.

Mieux encore, l’analyseur est heuristique et ne nécessite pas de « format » préexistant pour fonctionner.Il vous suffit de lui transmettre une chaîne de texte date/date-heure et d'obtenir un java.util.Date !

Je ne suis pas sûr qu'il existe un moyen simple d'analyser une date et de déterminer son modèle, mais j'aurais pensé que le modèle de celle que vous avez publiée serait :

EEE MMM jj HH:mm:ss zzz aaaa

Si vous souhaitez faire autre chose que d'analyser ou de formater une date, il n'y a pas grand-chose pour gérer les modèles eux-mêmes.Il y a quelque temps, j'écrivais un composant Swing pour saisir des dates dans un champ de texte formaté.Vous avez fourni un modèle et il a déplacé le curseur de saisie de texte à travers les éléments de ce modèle, autorisant uniquement les valeurs valides.

Dans le cadre de cela, j'ai écrit un DateFormatParser disponible ici dans le cadre du projet open source OpenHarmonise.

Analyser une date en un modèle serait un problème extrêmement intéressant à résoudre.Vous devrez faire certaines hypothèses (par ex.utilisation de :dans le temps et non dans la date), mais vous seriez confronté aux problèmes éternels des années à 2 chiffres et des arrangements jour/mois ou mois/jour.

Il convient de savoir que le format de date que vous avez indiqué n'est pas arbitraire.Il s'agit du résultat de la méthode Date.toString() intégrée (au moins dans les paramètres régionaux du Royaume-Uni et des États-Unis).Ce n'est pas une coïncidence si c'est aussi le format de la commande unix 'date' (au moins sous Linux, et je crois aussi à d'autres implémentations) - bien que pour être pédant, Date.toString() complète les nombres de jours à un chiffre avec un zéro while La date Unix ne le fait pas.

Cela signifie que vous recevrez probablement ce format de saisie lorsque vous insérerez une date non formatée dans un champ modifiable par l'utilisateur (par ex.un champ HTML INPUT) et recevez-le sans modification.Ainsi, ce n'est pas parce que les entrées arrivent dans ce format que les utilisateurs saisiront des milliers d'autres formats arbitraires.

Bien sûr, c’est encore possible.La façon dont je gère les entrées de date en général consiste à utiliser un tas de blocs try/catch, où je l'essaie avec un format, puis un autre, puis un autre.Notre framework standard compte désormais par défaut une vingtaine de formats différents.Bien sûr, ce n’est pas encore parfait ;L'autre jour, j'ai trouvé quelqu'un qui saisissait "03 septembre" comme date (une abréviation de mois non standard et sans année) et nous n'avions pas géré ce scénario.

Voir Apache Commons DateUtils.Il y a un parseDate méthode qui prend votre String et plusieurs modèles pour essayer de cracher un Date exemple.

Comme d'autres l'ont dit, le modèle semble être celui qu'il devrait être.

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"

En ce qui concerne l’analyse d’une date au format arbitraire, je ne connais aucune bibliothèque qui fasse cela en Java.Si vous vouliez développer une telle chose, je commencerais par regarder le perl str2time fonction.

Je dois dire que je trouve l'autre question très intéressante.Il y a cependant un problème sérieux : analysez ceci :08/07/06 !Si vous vous limitez à un sous-ensemble de formats attendus, vous pourriez probablement résoudre le problème en jouant avec les expressions rationnelles, vous pourriez créer un tas de modèles attendus, puis casser les chaînes sur des espaces ou autre, et faire correspondre partie par partie.

Demandez-vous simplement le modèle pour cette date donnée ?Si c'est le cas, je pense que ceci devrait le faire :

"EEE MMM d HH:mm:ss z yyyy"

Ou essayez-vous de prendre n'importe quelle date formatée, de déduire le format et de l'analyser ?

Que diriez-vous:

EEE MMM dd HH:mm:ss zzz yyyy

Passez simplement la chaîne dans le constructeur de SimpleDateFormat.Pour utiliser l'objet, appelez simplement la méthode d'analyse en passant la chaîne que vous souhaitez convertir en date.

Vous pourriez jeter un œil à :

http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html

Ce n'est pas vraiment la même chose, mais vous voudrez peut-être regarder quelque chose comme JChronique, qui peut effectuer un traitement du langage naturel sur les dates.Ainsi, la date de saisie pourrait être quelque chose comme « demain » ou « deux semaines à compter de mardi prochain ».

Cela peut ne pas aider du tout pour votre candidature, mais là encore, cela pourrait le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top