Не удалось получить LocalDateTime от TemporalAccessor при анализе LocalDateTime (Java 8)
Я просто пытаюсь преобразовать строку даты в объект DateTime в Java 8. После запуска следующих строк:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);
Я получаю следующую ошибку:
Exception in thread "main" java.time.format.DateTimeParseException:
Text '20140218' could not be parsed:
Unable to obtain LocalDateTime from TemporalAccessor:
{},ISO resolved to 2014-02-18 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
Синтаксис идентичен тому, что было предложено здесь, но я обслуживаюсь с исключением. Я использую JDK-8u25
.
Ответы
Ответ 1
Оказывается, Java не принимает значение "Голая дата" как DateTime. Использование LocalDate вместо LocalDateTime решает проблему:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);
Ответ 2
Если вам действительно нужно преобразовать дату в объект LocalDateTime, вы можете использовать LocalDate.atStartOfDay(). Это даст вам объект LocalDateTime в указанную дату, с установленным значением часа, минуты и второго поля 0:
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();
Ответ 3
Для того, что стоит, если кто-то должен снова прочитать эту тему (например, я), правильный ответ будет в определении DateTimeFormatter
, например:
private static DateTimeFormatter DATE_FORMAT =
new DateTimeFormatterBuilder().appendPattern("dd/MM/yyyy[ [HH][:mm][:ss][.SSS]]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter();
Необходимо указать необязательные поля, если они появятся. Остальная часть кода должна быть точно такой же.
Ответ 4
Это действительно непонятное и бесполезное сообщение об ошибке. После долгих проб и ошибок я обнаружил, что LocalDateTime
выдаст указанную выше ошибку, если вы не попытаетесь разобрать время. Используя LocalDate
вместо этого, он работает без ошибок.
Это плохо документировано, и соответствующее исключение очень бесполезно.
Ответ 5
Расширение на ответ ретрографы..: У меня была такая же проблема, даже при использовании LocalDate
, а не LocalDateTime
. Проблема заключалась в том, что я создал DateTimeFormatter
с помощью .withResolverStyle(ResolverStyle.STRICT);
, поэтому мне пришлось использовать шаблон даты uuuuMMdd
вместо yyyyMMdd
(т.е. "Год" вместо "год-эпохи" )!
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseStrict()
.appendPattern("uuuuMMdd")
.toFormatter()
.withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);
(Это решение было первоначально ответом на ответ ретрографы, но мне было предложено опубликовать его как автономный ответ, потому что он, по-видимому, отлично работает для многих людей.)
Ответ 6
Для тех, кто приземлился здесь с этой ошибкой, как и я:
Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}
Он исходил из следующей строки:
LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy h:mm"));
Оказалось, что это было потому, что я использовал 12hr Hour pattern за 0 час вместо 24-часовой картины.
Изменение часа до 24-часовой картины с использованием капитала H фиксирует это:
LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy H:mm"));
Ответ 7
Если дата String не содержит значения часов, минут и т.д., Вы не можете напрямую преобразовать это в LocalDateTime
. Вы можете преобразовать его только в LocalDate
, потому что строка представляет только компоненты года, месяца и даты, это будет правильная вещь.
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf); // 2018-03-06
В любом случае вы можете преобразовать это в LocalDateTime
.
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00
Ответ 8
Попробуй это:
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy");
LocalDate fromLocalDate = LocalDate.parse(fromdstrong textate, dateTimeFormatter);
Вы можете добавить любой желаемый формат. Это подходит для меня!
Ответ 9
Это прекрасно работает
public class DateDemo {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm");
String date = "16-08-2018 12:10";
LocalDate localDate = LocalDate.parse(date, formatter);
System.out.println("VALUE="+localDate);
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
LocalDateTime parse = LocalDateTime.parse(date, formatter1);
System.out.println("VALUE1="+parse);
}
}
выход:
VALUE=2018-08-16
VALUE1=2018-08-16T12:10