Анализировать LocalDateTime в зависимости от входной строки

Клиент может отправить любой 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;
    }

}

Есть предложения о том, как реализовать это более четко?

Закройте дубликат stackoverflow.com/questions/42310409/…, но не отвечает на часть «время по умолчанию».

Mark Jeronimus 21.11.2018 11:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
256
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проверьте длину входной строки, чтобы решить, какой формат следует применить, например:

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

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