Как проанализировать дату ISO с LocalDateTime.parse(...)

Я хочу разобрать строку даты как 2011-11-30 как это:

LocalDateTime.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE)

Но я получаю следующее исключение:

java.time.format.DateTimeParseException: Text '2011-11-30' could not be parsed:
Unable to obtain LocalDateTime from TemporalAccessor

Если я передаю строку даты и времени, все работает как положено:

LocalDateTime.parse("2011-11-30T23:59:59", DateTimeFormatter.ISO_LOCAL_DATE_TIME)

Как я могу разобрать дату как 2011-11-30 в LocalDateTime (со временем по умолчанию)?

2 ответа

Решение

Как предположил @JB Низет, следующие работы

LocalDate localDate = LocalDate.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE);
LocalDateTime localDateTime = localDate.atTime(23, 59, 59);
System.out.println(localDateTime); // 2011-11-30T23:59:59

Как я могу разобрать дату как 2011-11-30 в LocalDateTime (со временем по умолчанию)?

  1. Сначала разбери это в LocalDate
  2. использование LocalDateTimeatTime() способ установить время по умолчанию

Примечание: использование DateTimeFormatter.ISO_LOCAL_DATE лишнее для parse()см. API LocalDate#parse()

В приведенном ниже примере используются магические числа, которых следует избегать ( что такое магическое число и почему оно плохо?).

Вместо использования метода atTime (час, минута, секунда),

    LocalDate localDate = LocalDate.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE);
    LocalDateTime localDateTime = localDate.atTime(23, 59, 59);

Вы можете использовать константы LocalTime, такие как LocalTime.MAX, (23:59:59), LocalTime.MIN (00:00:00), LocalTime.MIDNIGHT (23:59:59) или LocalTime.NOON (12:00: 00)

    LocalDate localDate = LocalDate.parse("2011-11-30", DateTimeFormatter.ISO_LOCAL_DATE);
    LocalDateTime localDateTime = LocalDateTime.of(localDate, LocalTime.MIN);

Это лучше для ремонтопригодности и перекрестных ссылок.

Почему я написал этот ответ, несмотря на существующие ответы

К сожалению, все существующие ответы верны лишь частично. В них отсутствуют следующие важные аспекты современного API времени и даты:

  1. Использование формата ISO при разборе строки даты
  2. Как применить текущее время к экземпляру LocalDateTime получить новый экземпляр LocalDateTime с текущим временем

Вопрос, опубликованный OP:

Как я могу разобрать дату, например, 2011-11-30, на LocalDateTime (со временем по умолчанию)?

Ответ

У вашего подхода две проблемы:

  1. Поскольку вы анализируете строку даты, вы должны были использовать LocalDate#parse вместо того LocalDateTime#parse.

  2. Поскольку ваша строка даты уже находится в шаблоне ISO, вам не нужно указывать этот шаблон, используя DateTimeFormatter явно как LocalDate.parse по умолчанию использует этот шаблон.

    Помимо этих двух проблем, вам нужно будет использовать LocalDateTime#with применить текущее время к экземпляру LocalDateTime получить новый экземпляр LocalDateTime с текущим временем.

    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.LocalTime;
    
    public class Main {
        public static void main(String[] args) {
            // No need to specify DateTimeFormatter as the string is already in ISO format
            LocalDate date = LocalDate.parse("2011-11-30");
            System.out.println(date);
    
            // Get LocalDateTime from LocalDate
            LocalDateTime ldt = date
                                .atStartOfDay()         //Convert to LocalDateTime with 00:00
                                .with(LocalTime.now()); //Adjust to current time
    
            System.out.println(ldt);
        }
    }
    

    Выход:

    2011-11-30
    2011-11-30T11:53:39.103150
    

Примечание. Дополнительные сведения о современном API даты и времени можно найти в Trail: Date Time.

Другие вопросы по тегам