Клиент может отправить любой String в формате
"yyyy-MM-dd HH:mm:ss" или "yyyy-MM-dd", и в зависимости от этого мне нужно либо просто проанализировать полный LocalDateTime, если он прислал мне полный формат, либо создать объект LocalDateTime с частью Time по умолчанию "23:59:59"
На данный момент я написал это решение, но оно кажется плохим, поскольку я использую исключения для управления бизнес-логикой.
public class LocalDateTimeConverter implements IStringConverter<LocalDateTime> {
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public LocalDateTime convert(String value) {
LocalDateTime localDateTime;
try {
localDateTime = LocalDateTime.parse(value, DATE_TIME_FORMATTER);
} catch (DateTimeParseException ex) {
localDateTime = LocalDateTime.of(LocalDate.parse(value), LocalTime.of(23, 59, 59));
}
return localDateTime;
}
}
Есть предложения о том, как реализовать это более четко?




Проверьте длину входной строки, чтобы решить, какой формат следует применить, например:
public LocalDateTime convert(String value) {
value = value.trim();
boolean isShort = value.length() <= 10;
DateTimeFormatter DATE_TIME_FORMATTER;
if (isShort) {
DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
} else {
DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
}
LocalDateTime localDateTime;
try {
localDateTime = LocalDateTime.parse(value, DATE_TIME_FORMATTER);
if (isShort) {
localDateTime = localDateTime.with(LocalTime.of(23, 59, 59));
}
} catch (DateTimeParseException ex) {
localDateTime = null;
}
return localDateTime;
}
Я никогда не работал с parseDefaulting, но, похоже, это работает.
private static final DateTimeFormatter DATE_TIME_FORMATTER = new DateTimeFormatterBuilder()
.appendValue(ChronoField.YEAR_OF_ERA, 4, 4, SignStyle.NEVER)
.appendLiteral('-')
.appendValue(ChronoField.MONTH_OF_YEAR, 2, 2, SignStyle.NEVER)
.appendLiteral('-')
.appendValue(ChronoField.DAY_OF_MONTH, 2, 2, SignStyle.NEVER)
.optionalStart()
.appendLiteral(' ')
.appendValue(ChronoField.HOUR_OF_DAY, 2)
.appendLiteral(':')
.appendValue(ChronoField.MINUTE_OF_HOUR, 2)
.appendLiteral(':')
.appendValue(ChronoField.SECOND_OF_MINUTE, 2)
.optionalEnd()
.parseDefaulting(ChronoField.HOUR_OF_DAY, 23)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 59)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 59)
.toFormatter();
LocalDateTime.parse("2000-01-01 01:02:03", DATE_TIME_FORMATTER) // 2000-01-01T01:02:03
LocalDateTime.parse("2000-01-01", DATE_TIME_FORMATTER) // 2000-01-01T23:59:59
Закройте дубликат stackoverflow.com/questions/42310409/…, но не отвечает на часть «время по умолчанию».