java.texte.ParseException: Unparseable date
J'obtiens l'erreur suivante:
java.texte.ParseException: Unparseable date: "31 Août 09:53:19 2011" avec ce format: new SimpleDateFormat("MMM dd HH:mm:ss yyyy");
Personne ne voit le problème?
Semble bien pour moi. Assurez-vous que vous utilisez le SimpleDateFormat objet que vous avez créé avec le code de réellement analyser la date donnée.
Astuce: Toujours spécifier explicitement à la fois la
Pour info, le gênants vieille date-heure classes telles que
Astuce: Toujours spécifier explicitement à la fois la
Locale
et le fuseau horaire de la date de votre temps de travail plutôt que de s'appuyer implicitement sur la JVM par défaut en cours. Les deux peuvent changer à tout moment en cours d'exécution.Pour info, le gênants vieille date-heure classes telles que
java.util.Date
, java.util.Calendar
, et java.text.SimpleDateFormat
sont maintenant héritage, supplantée par la java.temps les classes intégré dans Java 8 et les versions ultérieures. Voir Tutoriel Oracle.OriginalL'auteur Stijn.V | 2011-08-31
Vous devez vous connecter pour publier un commentaire.
Assurez-vous que vous utilisez la bonne localisation. (Le
SimpleDateFormat(String)
constructeur utilise les paramètres régionaux système par défaut, qui peut ne pas être celui que vous voulez utiliser.)Cela fonctionne très bien sur ma machine:
(Lors de l'utilisation
Locale.FRENCH
par exemple, les résultats dans unParseException
.)Ceci résout le problème, mais pourquoi? ce qui est changé lorsque les paramètres régionaux est de la france???
le nom du mois - Août serait plutôt de devenir août
OriginalL'auteur aioobe
Le format lui-même est OK pour l'entrée que vous avez donné. Mais vous pouvez obtenir cette erreur si vos paramètres régionaux par défaut est définie à quelque chose où "Août" n'est pas une abréviation du nom du mois. Essayez d'utiliser par exemple pour
Locale.US
et vous allez voir que cela va fonctionner:J'ai la date comme ceci
2017-08-01T08:32:38.5544401-05:00
et c'est le modèleyyyy-MM-dd'T'HH:mm:ssz
. et je suis l'exception. S'il vous plaît aidervotre date ne correspond pas au modèle; il y a des fractions de secondes dans la chaîne de date, qui ne sont pas dans le modèle. Utiliser le modèle correct.
tu veux dire ss.sssssss?
Non, c'est un peu plus compliqué parce que
SimpleDateFormat
ne peut pas traiter avec 7 chiffres de fractions de secondes. Voir: stackoverflow.com/questions/12000673/...OriginalL'auteur Jesper
tl;dr
Locale
, afin de déterminer le langage humain et les normes culturelles utilisées dans la traduction du nom du mois.Exemple artificiel:
Détails
Les deux autres réponses par aioobe et par Jesper sont tous les deux corrects: Implicitement à l'aide d'un
Locale
avec un langage humain qui ne correspond pas à la langue de votre entrée de texte.Cette Réponse explique une nouvelle façon de faire le travail. Aussi, les autres Réponses ne répondent pas à la question cruciale de fuseau horaire.
java.temps
Avance rapide quelques années plus tard, à partir de cette publication, et nous avons maintenant la nouvelle java.en temps intégré dans Java 8 et les versions ultérieures. Ces nouvelles classes supplanter l'ancienne java.util.Date/.Calendrier & SimpleDateFormat classes. Ces vieilles classes ont prouvé pour être ennuyeux, déroutant, et vicié.
Formateur Motif
Définir les données à analyser et de son format.
Si non spécifié, la
DateTimeFormatter
est affecté à laLocale
qui fait actuellement défaut dans la JVM. Cette valeur par défaut peut changer à tout moment, même en cours d'exécution(!). Il faut donc toujours préciser le désiré ou attenduLocale
.Étant donné que l'entrée est dépourvue de toute zone de temps ou de décalage-de-UTC de l'information, l'analyser comme un
LocalDateTime
.Si le contexte vous savez le but de décalage de l'heure UTC ou d'un fuseau horaire pour cette date-valeur du temps, de l'attribuer.
Si l'UTC, l'utilisation de la
ZoneOffset.UTC
de la constante pour obtenir uneOffsetDateTime
objet.Un fuseau horaire est une offset-de-UTC plus un ensemble de règles de traitement des anomalies telles que l'Heure d'été (DST). Utilisation fuseau horaire noms, jamais le 3-4 lettre abréviations.
Spécifier Le Fuseau Horaire
Cet élément de langage de l'homme est la clé de la pièce manquante pour répondre à la Question. La spécification de la bonne
Locale
pour l'homme de langue correspondant à la langue de votre chaîne d'entrée à résoudre ce problème.Mais notez que le fuseau horaire est également critique; les autres réponses ignoré cette question ainsi implicitement à l'aide de la JVM actuelle du fuseau horaire par défaut. Ce n'est pas conseillé, car elle repose sur le système d'exploitation hôte comme une valeur par défaut initiale (peut varier) et en outre, tout le code dans un thread de n'importe quelle application à l'intérieur de la JVM peut changer la JVM par défaut en cours de fuseau horaire pendant de l'exécution. Mieux spécifier les attentes de fuseau horaire que reposent implicitement sur par défaut.
Des Objets Immuables
Noter la syntaxe. Ces cours sont conçus pour être immuable. Donc, plutôt que de la modification (mutation) d'un objet, un nouvel objet est créé sur la base de l'ancien objet de valeurs. Cela signifie que nous sommes pas affectant la
DateTimeFormatter
objet défini ci-dessus et tenue dans l'formatter
variable (référence de l'objet). Nous sommes de créer, d'utiliser et de jeter un nouvel objet DateTimeFormatter (en fait, deux de nouveaux objets) à l'intérieur de cette ligne de code.Méthode De Référence
La documentation suggère une autre façon d'analyser une chaîne de caractères est l'appel de la
parse
méthode où l'on passe d'un méthode de référence (Java 8) de la classe du type de résultat que vous désirez (comme leTemporalQuery
):ZonedDateTime::from
,LocalDateTime::from
,LocalDate::from
, et ainsi de suite.Pour la démonstration, nous allons tourner autour et de créer une représentation de Chaîne que
ZonedDateTime
de la valeur, mais en français Québécois.Encore mieux, nous allons localiser plutôt que de coder en dur un format particulier.
De vidage de la console.
Lors de l'exécuter.
Sur java.temps
La java.temps cadre est intégré dans Java 8 et les versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date du temps des classes comme
java.util.Date
,Agenda
, &SimpleDateFormat
.La Joda-Time projet, maintenant dans le mode de maintenance, conseille la migration vers le java.le temps classes.
Pour en savoir plus, consultez les Oracle Tutoriel. Et de recherche de Débordement de Pile pour de nombreux exemples et des explications. La spécification est JSR 310.
Vous pouvez échanger java.temps objets directement avec votre base de données. Utiliser un Pilote JDBC compatible avec JDBC 4.2 ou plus tard. Pas besoin de chaînes, pas besoin de
java.sql.*
classes.Où obtenir le java.les classes de temps?
OriginalL'auteur Basil Bourque