【问题标题】:validate date in a particular format using preconditions使用前置条件以特定格式验证日期
【发布时间】:2016-01-08 23:59:34
【问题描述】:

我有一个字符串格式的日期YYYY/MM/DD HH:MM:SS,我需要使用前置条件 google guava 类对其进行验证。我在很多其他地方使用checkArgument 方法。我如何使用checkArgument 方法来验证startDate 以确保它仅采用这种格式YYYY/MM/DD HH:MM:SS,如果不是,则抛出IllegalArgumentException 和一些消息。

public Builder startDate(String startDate) {
    // validate startDate here using checkArgument if it is not valid then throw IllegalArgumentException.
    this.sDate = startDate;
    return this;
}

这里如何使用 checkArgument 方法?

【问题讨论】:

    标签: java date preconditions


    【解决方案1】:

    不要。写

     try {
       new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse(startDate);
     } catch (ParseException e) {
       throw new IllegalArgumentException(e);
     }
    

    ..这也可以让你存储 Date 解析并在以后使用它。 (不过,公平地说,java.util.Date 是一个最好避免使用的糟糕 API——但您暗示您在之前似乎已删除的问题中使用了它。)

    如果您最终使用 Joda Time,http://joda-time.sourceforge.net/userguide.html#Input_and_Output 将解释如何根据这些需求调整此答案。

    【讨论】:

    • 请注意,默认情况下,SimpleDateFormat 实例是 lenient w.r.t。解析输入字符串。因此,除非您想让2015/13/32 25:60:60 等日期字符串正确解析,否则您应该在解析之前在SimpleDateFormat 实例上调用setLenient(false)
    【解决方案2】:

    The Answer by Louis Wasserman 是正确的。他提到避免使用 java.util.Date。

    java.time

    该 java.util.Date 类及其伙伴 java.util.Calendar 在 Java 8 中已被 java.time 框架取代。请参阅Oracle Tutorial

    我们改用DateTimeFormatterDateTimeParseException 类。包含在java.time.format 包中。

    这是他使用 java.time 类的答案的等价物。

    try {
        DateTimeFormatter.ofPattern ( "yyyy/MM/dd HH:mm:ss" ).parse ( input );
    } catch ( e ) {
        throw new DateTimeParseException ( e );
    }
    

    乔达时间

    对于那些无法迁移到 Java 8 或更高版本的用户,请将 Joda-Time 库添加到您的项目中。 Joda-Time 为 java.time 提供了灵感,两个框架共享相同的概念。

    Wasserman’s same logic 适用于我们的解决方案:尝试解析并捕获异常。我们使用来自 Joda-Time 的 DateTimeFormatter 类,当遇到错误输入时,它会抛出标准 Java IllegalArgumentException

    try {
        DateTimeFormatter formatter = DateTimeFormat.forPattern ( "yyyy/MM/dd HH:mm:ss" );
        DateTime dt = formatter.parseDateTime ( input );
    } catch ( e ) {
        throw new IllegalArgumentException ( e );
    }
    

    【讨论】:

    • 我现在使用的是 Java 7,所以不能使用 Java 8。:(
    • @user1950349 如果您可以可能管理它,我强烈建议您在java.util.Date 上使用 Joda Time 等第三方库。
    • @LouisWasserman 我可以做到这一点,但它会改变你的解析逻辑吗?
    • @user1950349,当然,你必须使用 Joda 的 API。 joda-time.sourceforge.net/userguide.html#Input_and_Output 解释了那里的所有细节。
    • 正如 Wasserman 所说,旧的日期时间类确实非常糟糕,应该避免使用。添加并改用Joda-Time 库。在使用 Joda-Time 时,请遵循 Wasserman 的回答中看到的相同逻辑:调用日期时间格式化程序实例以尝试解析,并捕获解析异常。
    【解决方案3】:

    您可以根据正则表达式测试整个字符串:

    Preconditions.checkArguments(str.matches(VALID_DATE_REGEX));
    

    为了加快速度,您可以编译一次 Pattern 并反转调用

    Preconditions.checkArgument(VALID_DATE_REGEX.matcher(str).matches());
    

    但是这是一种气味。你不应该在你的程序中来回携带这个文本字符串:如果你需要这种格式,那只是因为在某些时候你会将它转换为日期。所以你最好决定你的程序是否可以接受无效输入并将其报告给用户,或者它是否应该立即终止。

    后者更容易处理:立即解析文本并为无效输入抛出异常。否则,您需要在程序中引入验证步骤,然后编写一种方法来停止流程并向用户显示输入中的任何阻塞和非阻塞错误。

    【讨论】:

      猜你喜欢
      • 2011-09-17
      • 1970-01-01
      • 2021-09-25
      • 2013-07-06
      • 2021-07-18
      • 2021-05-03
      • 1970-01-01
      • 2014-05-17
      • 2018-10-21
      相关资源
      最近更新 更多