【问题标题】:Parse LocalDateTime depending on input string根据输入字符串解析 LocalDateTime
【发布时间】:2018-11-21 10:30:54
【问题描述】:

客户端可以发送String格式 "yyyy-MM-dd HH:mm:ss""yyyy-MM-dd" 取决于它我需要解析完整的LocalDateTime(如果他向我发送完整格式)或使用默认的Time 部分创建LocalDateTime 对象@ 部分"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;
    }

}

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

【问题讨论】:

标签: java java-8 java-time


【解决方案1】:

我从未与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】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 2020-02-27
      • 1970-01-01
      相关资源
      最近更新 更多