Используйте строку шаблона формата для определения формата.
public class PlanSubscriptionDto {
private static final DateTimeFormatter FORMATTER
= DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
private Long id;
private Map<String, List<Long>> details;
private LocalDateTime dateOccurred;
public void setDateOccurred(String dateTime) {
this.dateOccurred = LocalDateTime.parse(dateTime, FORMATTER);
}
}
Почему ваш код не работает?
Формат ISO 8601 имеет T
между датой и временем . В строке даты и времени нет T
, поэтому DateTimeFormatter.ISO_DATE_TIME
не может ее проанализировать.
Варианты
Теперь мы находимся, я хотел бы показать пару других параметры. Вкус отличается, поэтому я не могу сказать, какой из них вам больше понравится.
Вы можете указать T
, чтобы получить формат ISO 8601. Тогда вам не понадобится явное средство форматирования. Один аргумент LocalDateTime.parse()
анализирует формат ISO 8601.
public void setDateOccurred(String dateTime) {
dateTime = dateTime.replace(' ', 'T');
this.dateOccurred = LocalDateTime.parse(dateTime);
}
Или, придерживаясь средства форматирования и промежутка между датой и временем, мы можем определить средство форматирования более многословным способом:
private static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral(' ')
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.toFormatter();
Что мы получаем для дополнительных строк кода, так это (1) большее повторное использование встроенных средств форматирования (2) это средство форматирования будет принимать время без секунд и время с долей секунды, потому что DateTimeFormatter.ISO_LOCAL_TIME
принимает.
Ссылка
Статья в Википедии: ISO 8601