В строке шаблона вашего формата вам нужно использовать прописные буквы H
для часа дня:
.appendPattern("M/d/yyyy[ H:mm]")
С этим изменением ваш первый фрагмент кода
2020-04-11T01:20
LocalDateTime
Нижний регистр h
для часа в течение AM или PM. Таким образом, ваше время могло означать 01:20 или 01:20 вечера, то есть 13:20. Ява не могла принять решение и поэтому решила не интерпретировать время суток, а только дать вам LocalDate
.
Если вы всегда хотите LocalDateTime
, вы также можете использовать parseDefaulting
:
DateTimeFormatter patternWithOptional = new DateTimeFormatterBuilder()
.appendPattern("M/d/yyyy[ H:mm]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.toFormatter();
System.out.println(LocalDateTime.parse("4/11/2020 1:20", patternWithOptional));
System.out.println(LocalDateTime.parse("4/11/2020", patternWithOptional));
Выход:
2020-04-11T01:20
2020-04-11T00:00
С другой стороны, если вы делаете хотите либо LocalDate
, либо LocalDateTime
в зависимости от того, доступно ли время дня в строке, вам не нужно DateTimeFormatterBuilder
:
DateTimeFormatter patternWithOptional = DateTimeFormatter.ofPattern("M/d/yyyy[ H:mm]");