Analizar LocalDateTime dependiendo de cadena de entrada

Oleksandr Riznyk:

El cliente podría ser capaz de enviar ya sea Stringen formato "yyyy-MM-dd HH:mm:ss"o "yyyy-MM-dd"y en función de lo que necesita, ya sea simplemente analizar completa LocalDateTimesi él me envió formato completo o para crear LocalDateTimeobjetos con un valor predeterminado Timeparte"23:59:59"

Por ahora he escrito esta solución, pero parece ser malo como yo estoy usando excepciones para controlar la lógica de negocio.

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;
    }

}

Cualquier sugerencia sobre cómo implementar de forma más clara?

Marcos Jeronimus:

Nunca he trabajado con parseDefaulting, pero un tiro rápido en el que parece que funciona.

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=223871&siteId=1
Recomendado
Clasificación