web-dev-qa-db-fra.com

convertir la chaîne "aaaa-MM-jj" en heure locale

Est-il possible de convertir une date String en LocalDateTime avec le format "yyyy-MM-dd"?

Si j'essaye ceci:

DateTimeFormatter DATEFORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDateTime ldt = LocalDateTime.parse(string, DATEFORMATTER);

J'ai cette exception:

Java.time.format.DateTimeParseException: Text '2017-03-13' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {},ISO resolved to 2017-03-13 of type Java.time.format.Parsed
    at Java.time.format.DateTimeFormatter.createError(DateTimeFormatter.Java:1920)
    at Java.time.format.DateTimeFormatter.parse(DateTimeFormatter.Java:1855)
    at Java.time.LocalDateTime.parse(LocalDateTime.Java:492)
    at hu.npsh.workforce.utils.Util.stringToLocalDateTime(Util.Java:284)
    at hu.npsh.workforce.utils.util.StringLocalDateTimeConversionTest.stringToLocalDateTimeTest(StringLocalDateTimeConversionTest.Java:35)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.Java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.Java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.Java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.Java:363)
    at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.Java:86)
    at org.Eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.Java:38)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:459)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:678)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:382)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:192)
Caused by: Java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: {},ISO resolved to 2017-03-13 of type Java.time.format.Parsed
    at Java.time.LocalDateTime.from(LocalDateTime.Java:461)
    at Java.time.format.Parsed.query(Parsed.Java:226)
    at Java.time.format.DateTimeFormatter.parse(DateTimeFormatter.Java:1851)
    ... 26 more
Caused by: Java.time.DateTimeException: Unable to obtain LocalTime from TemporalAccessor: {},ISO resolved to 2017-03-13 of type Java.time.format.Parsed
    at Java.time.LocalTime.from(LocalTime.Java:409)
    at Java.time.LocalDateTime.from(LocalDateTime.Java:457)
    ... 28 more

Je sais que le problème principal, à savoir que le modèle ne contient pas l'heure et la minute ... Mais si je veux créer une méthode, ce qui donne une String et une DateTimeFormatter et je veux revenir avec LocalDateTime

Existe-t-il une solution correcte et agréable?

MODIFIER:

Mon objectif est de créer une méthode qui obtienne une String et une DateTimeFormatter Et retourne avec une LocalDateTime. Le modèle peut être n'importe quoi (ce qui est valide).

10
LakiGeri

Utilisez LocalDate pour créer une date locale puis ajoutez le timepart si vous en avez besoin:

    DateTimeFormatter DATEFORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    LocalDate ld = LocalDate.parse("2017-03-13", DATEFORMATTER);
    LocalDateTime ldt = LocalDateTime.of(ld, LocalDateTime.now().toLocalTime());
    System.out.println(ldt);

ou LocalDateTime

ldt = LocalDateTime.of(ld, LocalDateTime.MIN.toLocalTime());

si vous avez juste besoin d'un timepart vide

MODIFIER:

Regardez cette solution avec cela, vous pouvez construire votre analyseur dynamique:

    DateTimeFormatter DATEFORMATTER1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    DateTimeFormatter DATEFORMATTER = new DateTimeFormatterBuilder().append(DATEFORMATTER1)
    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
    .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
    .toFormatter();

    //DateTimeFormatter DATEFORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    LocalDateTime ldt = LocalDateTime.parse("2017-03-13", DATEFORMATTER);
24
Jens

Vous ne pouvez pas convertir "2017-03-13" en une LocalDateTime car il n'y a pas d'informations temporelles dans la chaîne, mais uniquement la date. Vous pouvez le convertir en LocalDate

DateTimeFormatter dateformatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate ld = LocalDate.parse("2017-03-13", dateformatter);

après cela, nous pouvons le convertir en LocalDateTime

LocalDateTime ldt = ld.atStartOfDay();
16
Anton Balaniuc

Que diriez-vous d'un one-liner?

LocalDateTime.parse("2017-03-13" + " 00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm"));
0
Zon

Pour le début de la journée, vous pouvez utiliser:

LocalDate.parse("2017-10-18", DateTimeFormatter.ofPattern("yyyy-MM-dd"))
.atStartOfDay().atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ISO_DATE_TIME)

En fin de journée, vous pouvez utiliser:

LocalDate.parse("2017-10-18", DateTimeFormatter.ofPattern("yyyy-MM-dd"))                        
.atStartOfDay().plusHours(23).plusMinutes(59).plusSeconds(59).atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ISO_DATE_TIME)

Pour localDateTime, vous pouvez utiliser:

LocalDate.parse("2017-10-18", DateTimeFormatter.ofPattern("yyyy-MM-dd")).atTime(LocalTime.now())
.atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"))

Résultat:

2017-10-18T00:00:00Z
2017-10-18T23:59:59Z
2017-10-18T14:45:35Z
0
Vinayak Shenoy