Как проанализировать дату 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 (со временем по умолчанию)?
- Сначала разбери это в
LocalDate
- использование
LocalDateTime
atTime()
способ установить время по умолчанию
Примечание: использование 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 времени и даты:
- Использование формата ISO при разборе строки даты
- Как применить текущее время к экземпляру
LocalDateTime
получить новый экземплярLocalDateTime
с текущим временем
Вопрос, опубликованный OP:
Как я могу разобрать дату, например, 2011-11-30, на LocalDateTime (со временем по умолчанию)?
Ответ
У вашего подхода две проблемы:
Поскольку вы анализируете строку даты, вы должны были использовать
LocalDate#parse
вместо тогоLocalDateTime#parse
.Поскольку ваша строка даты уже находится в шаблоне 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.