web-dev-qa-db-fra.com

Conversion de String en LocalDate avec / sans nanoSeconds

J'ai besoin de convertir une chaîne en LocalTime (Java-8 pas joda) qui peut ou non avoir nanoOfSeconds dans la chaîne. Le format String est sous la forme de 07:06:05 ou 07:06:05.123456 La chaîne peut ou non avoir une décimale dans les secondes et lorsqu'elle le fait, il peut y avoir un nombre quelconque de caractères pour représenter la partie Nano Seconds.

Utilisation d'un DateTimeForamtter tel que

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss");

ou

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss.SSSSSS");

Je peux utiliser une instruction IF pour distinguer les deux formats tels que:

DateTimeFormatter dtf;
if (time1.contains(".") {
   dtf = DateTimeFormatter.ofPattern("H:mm:ss.SSSSSS);
} else {
   dtf = DateTimeFormatter.ofPattern("H:mm:ss);
}

Cela fonctionne bien et je suis d'accord avec cela, mais je dois également pouvoir utiliser un nombre variable de positions après la virgule décimale.

Un exemple d'ensemble de données peut être:

[11:07:59.68750, 11:08:00.781250, 11:08:00.773437500, 11:08:01]

Existe-t-il un moyen d'autoriser le formateur à analyser n'importe quel nombre de chiffres après la décimale sans lancer un Java.time.format.DateTimeParseException lorsque le nombre de décimales est inconnu?

J'espère avoir raté quelque chose de vraiment simple.

12
jbolt

Il n'est pas nécessaire de faire quoi que ce soit de spécial pour analyser ce format. LocalTime.parse(String) gère déjà les nanosecondes facultatives:

System.out.println(LocalTime.parse("10:15:30"));
System.out.println(LocalTime.parse("10:15:30."));
System.out.println(LocalTime.parse("10:15:30.1"));
System.out.println(LocalTime.parse("10:15:30.12"));
System.out.println(LocalTime.parse("10:15:30.123456789"));

Toutes les analyses ci-dessus, voir aussi Javadocspec .

29
JodaStephen

Vous pouvez utiliser des "sections facultatives" du modèle de format pour cela:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss[.SSSSSS]");
8
Jon Skeet