Подтвердить что ты не робот

Не удалось получить 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.

4b9b3361

Ответ 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