Question

Existe-t-il un moyen de forcer Joda à l'heure de l'analyse des dates uniquement lorsqu'elles contiennent des années à quatre chiffres? Par exemple:

  • 2009-11-11 - devrait analyser
  • 09-11-11 - ne doit pas analyser

J'ai essayé le code suivant:

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DateTimeFormatter formatter = builder.appendYear(4, 4).appendLiteral('-').appendMonthOfYear(1).appendLiteral('-').appendDayOfMonth(1).toFormatter();
formatter.parseDateTime("09-11-11");

Pars dans 0009-11-11. Apparemment, les minDigits dans la méthode appendYear ne sont utilisés que pour le formatage lors de l'impression de la date.
Le résultat est le même si j'utilise appendYearOfEra (). Si j'utilise appendYearOfCentury (), il analyse l'année en 1909 à la place.

Nous mettons en place un analyseur de données général, qui reconnaîtra différents types d’entrées. Aussi, l'exemple est une forme abrégée de la vraie affaire (pour plus de simplicité). Les scénarios de la vie réelle analysent les dates qui peuvent avoir des jours de la semaine, des mois sous forme de mots, heure, zone et différents caractères séparant mois, jour et année. Par conséquent, écrire un RegEx ou vérifier le contenu / la longueur de la chaîne peut s'avérer assez difficile.

Certains exemples réels pourraient ressembler à ceci:

  • 2009-11-11
  • Mercredi 2009-11-11T15: 00: 00
  • 2009/11/11 15:00
  • et beaucoup d'autres ...
Était-ce utile?

La solution

DateTimeFormatterBuilder.appendFixedDecimal () peut bien faire ce dont vous avez besoin.

Vous pouvez également implémenter l'interface DateTimeParser pour créer le parser de votre choix et le transférer dans DateTimeFormatterBuilder.

Autres conseils

Vous pouvez vérifier la longueur de la chaîne de date.

Vous pouvez créer des analyseurs et des formateurs extrêmement spécifiques en utilisant DateTimeFormatterBuilder . Il n’est généralement pas nécessaire d’utiliser cette classe directement, car les formats les plus courants sont plus facilement disponibles ailleurs dans l’API, mais c’est la classe du générateur qu’ils utilisent tous sous la couverture.

Que voulez-vous obtenir d’un utilisateur qui a entré "0001-01-01" comme date (c’est-à-dire qu’il a entré 4 chiffres pour l’année, mais que les trois premiers étaient des zéros)? Qu'en est-il de '0999-12-31'? Et '999-12-31'? Et que dire de «10000-01-01» - le fameux Y10K 1 problème?

  • S'il s'agit d'une valeur légitime, alors vous êtes obligé de découvrir la longueur de ce que l'utilisateur a saisi comme partie d'année de la date (probablement après toute autre analyse), et de vous assurer qu'elle est bien moins (ou est-ce exactement?) quatre chiffres.

  • S'il ne s'agit pas d'une valeur légitime, vous ne pourrez plus vérifier la valeur de l'année une fois la date analysée.

  • Ou vous pouvez prendre le code et le modifier afin qu'il inclue votre définition préférée d'année valide.

1 Je ne prévois pas de commencer à résoudre le problème de Y10K avant le 5 janvier 2000.

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