Analyse Java DateTimeFormatter de 8 secondes fractionnaires facultatives d’importance variable

Mon MCVE (en tant que test unitaire TestNG ):

public class MyDateTimeFormatterTest { private static final Ssortingng BASE_PATTERN = "yyyy/MM/dd HH:mm:ss"; private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(BASE_PATTERN + "[.SSSSSSSSS]"); private static final LocalDateTime TEST_INPUT = LocalDateTime.of(2015, 5, 4, 12, 34, 56, 123456789); @DataProvider(name = "test-cases") public Iterator getTestCases() { return Arrays.asList(testFor("", ChronoUnit.SECONDS), testFor(".SSS", ChronoUnit.MILLIS), testFor(".SSSSSS", ChronoUnit.MICROS), testFor(".SSSSSSSSS", ChronoUnit.NANOS)).iterator(); } @Test(dataProvider = "test-cases") public void testWithDefaultResolution(Ssortingng input, LocalDateTime output) { assertThat(FORMATTER.parse(input, LocalDateTime::from), equalTo(output)); } private Object[] testFor(Ssortingng patternSuffix, TemporalUnit truncatedTo) { return new Object[] { DateTimeFormatter.ofPattern(BASE_PATTERN + patternSuffix) .format(TEST_INPUT), TEST_INPUT.truncatedTo(truncatedTo) }; } } 

J’essaie de tester l’parsing d’une Ssortingng date-heure avec des fractions de secondes facultatives d’importance variable à l’ aide de DateTimeFormatter . La partie pertinente de la Javadoc se lit comme suit:

Fraction : Affiche le champ nano de seconde sous forme de fraction de seconde. La valeur nano-de-seconde comporte neuf chiffres, ainsi le nombre de lettres du modèle va de 1 à 9. S’il est inférieur à 9, la valeur nano-de-seconde est tronquée, seuls les chiffres les plus significatifs étant sortis.

Sur la base de ma compréhension limitée, j’avais l’habitude de [...] marquer les fractions de seconde comme facultatives, et comme je m’intéresse à une signification variable, j’ai pensé que je devrais m’en tenir à SSSSSSSSS .

Cependant, le test unitaire échoue jusqu’à l’ parsing en millisecondes et en microsecondes, c’est-à-dire les deuxième et troisième cas. Changer le LENIENT en LENIENT n’aide pas ici car il échoue au stade de l’parsing, pas à la résolution.

Puis-je savoir quelles approches dois-je envisager pour résoudre mon problème? Devrais-je utiliser DateTimeFormatterBuilder pour spécifier facultativement chaque chiffre fractionnaire (9 fois), ou existe-t-il une méthode plus intelligente avec mon modèle?

modifier J’ai trouvé ma propre réponse à la fin … je vais laisser cette question sans réponse pendant un jour et voir s’il y a d’autres approches ou non.

Oh cool, 15 minutes supplémentaires de dépannage ont donné ceci:

 private static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder().appendPattern(BASE_PATTERN) // .parseLenient() .appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter(); 

modifier parseLenient() est facultatif .