代码之家  ›  专栏  ›  技术社区  ›  Oleksandr Riznyk

根据输入字符串分析localdatetime

  •  2
  • Oleksandr Riznyk  · 技术社区  · 6 年前

    客户端可以发送 String 格式 "yyyy-MM-dd HH:mm:ss" "yyyy-MM-dd" 根据它,我需要要么完全解析 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;
        }
    
    }
    

    关于如何更清晰地实施它有什么建议吗?

    2 回复  |  直到 6 年前
        1
  •  7
  •   Mark Jeronimus    6 年前

    我从来没有和 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
    
        2
  •  1
  •   forpas    6 年前

    检查输入字符串的长度以决定必须应用哪种格式,如下所示:

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