4
votes

L'analyse des dates locales ne fonctionne pas sans séparateurs

J'ai une date formatée de la manière suivante:

L'année en quatre chiffres puis le numéro de la semaine en deux chiffres.

Par exemple, la quatrième semaine de 2018 sera 201804

J'ai du mal à analyser ces dates en utilisant LocalDate em> et DateTimeFormatterBuilder.

Voici comment j'essaye d'analyser la date:

LocalDate.parse(
    "2018 04",
    new DateTimeFormatterBuilder().appendPattern("YYYY ww").parseDefaulting(WeekFields.ISO.dayOfWeek(), 1).toFormatter()
);

L'exécution lève l'exception suivante :

java.time.format.DateTimeParseException: Le texte '201804' n'a pas pu être analysé à l'index 0

Le comportement étrange est que, lorsque j'ajoute un séparateur entre les parties de date, l'exception n'est plus levée:

LocalDate.parse(
    "201804",
    new DateTimeFormatterBuilder().appendPattern("YYYYww").parseDefaulting(WeekFields.ISO.dayOfWeek(), 1).toFormatter()
);

Résultats en: p>

22/01/2018

Y a-t-il quelque chose qui me manque avec le formateur?


1 commentaires

la quatrième semaine de 2018 ou 2019 ??


4 Réponses :


0
votes

Ne ferais-tu pas simplement ce travail?

LocalDate.parse ("2018041", DateTimeFormatter.ofPattern ("YYYYwwe"));

Vous devez essentiellement lui dire que vous voulez la date du lundi de cette semaine, pas seulement la semaine.


3 commentaires

La modification de DateTimeFormatter.of par DateTimeFormatter.ofPattern lève malheureusement la même exception: /


Non, ce ne serait pas le cas.


Modifié, il vous suffit d'ajouter 1 à la date que vous analysez pour lui faire choisir le lundi de cette semaine, et utiliser YYYYwwe .



2
votes

Essayez de définir explicitement les champs chrono:

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DateTimeFormatter formatter = 
      builder.appendValue(ChronoField.YEAR, 4)
             .appendValue(ChronoField.ALIGNED_WEEK_OF_YEAR, 2)
             .parseDefaulting(ChronoField.DAY_OF_WEEK, 1)
             .toFormatter();

LocalDate.parse("201804", formatter);


2 commentaires

Cela ne semble pas fonctionner, l'exécution de votre extrait de code renvoie -596400000-01-17


@ThomasFerro Ups, c'est une faute de frappe. Doit être appendValue au lieu de appendFraction . Mise à jour de l'extrait de code.



0
votes

Oui, cela m'a aussi tué beaucoup de fois avec des données provenant de sources étrangères ....

En fonction de ce que vous obtenez, vous avez besoin de différents analyseurs. Pour une date, vous avez besoin de LocalDate et pour quelque chose avec une heure, vous avez besoin de LocalTimedate.parse.

Ce qui signifie que si vous ne savez pas quelles données vous obtenez (ce jour-là est souvent sans date mais avec heure et, par contre, des dates dans le passé sans heure mais avec date - donc vous ne savez pas), vous avez pour commencer par faire une analyse grossière vous-même afin de détecter le format particulier et seulement après que Java laisse l'analyser .... Javas La gestion des dates est à mon avis un peu difficile.

La solution est donc: utilisez LocalDate au lieu de LocalTimeDate.


2 commentaires

Merci pour le conseil, mais dans ce cas particulier, je connais le format exact, "YYYYww", et j'utilise déjà LocalDate et non LocalTimeDate.


un désolé. Mais je pense toujours que c'est cette particularité des formats spéciaux (contrairement au fait d'en avoir libre) qui vous pose des problèmes.



5
votes

Vous pouvez utiliser appendValue

Cette méthode prend en charge une technique spéciale d'analyse appelée «analyse des valeurs adjacentes». Cette technique résout le problème où une valeur, variable ou de largeur fixe, est suivie d'une ou plusieurs valeurs de longueur fixe. L'analyseur standard est gourmand, et donc il volerait normalement les chiffres nécessaires aux analyseurs de valeurs à largeur fixe qui suivent la largeur variable.

Aucune action n'est requise pour lancer «l'analyse des valeurs adjacentes». Lorsqu'un appel à appendValue est effectué, le générateur entre en mode de configuration d'analyse des valeurs adjacentes.

Donc ça marche:

LocalDate.parse(
                "201804",
                new DateTimeFormatterBuilder()
                        .appendValue(YEAR, 4)
                        .appendValue(ALIGNED_WEEK_OF_YEAR, 2)
                        .parseDefaulting(WeekFields.ISO.dayOfWeek(), 1).toFormatter()
        );


0 commentaires