2

我有一个字符串格式的日期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 方法?

4

3 回答 3

2

不。写

 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解释了如何根据这些需求调整此答案。

于 2016-01-09T00:10:40.407 回答
1

Louis Wasserman 的回答是正确的。他提到避免使用 java.util.Date。

java.time

该 java.util.Date 类及其伙伴 java.util.Calendar 在 Java 8 和更高版本中已被java.time框架取代。请参阅Oracle 教程

我们使用DateTimeFormatterandDateTimeParseException类来代替。包含在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 的相同逻辑适用于我们的解决方案:尝试解析并捕获异常。我们使用DateTimeFormatter来自 Joda-Time 的类,它IllegalArgumentException在遇到错误输入时会抛出标准 Java。

try {
    DateTimeFormatter formatter = DateTimeFormat.forPattern ( "yyyy/MM/dd HH:mm:ss" );
    DateTime dt = formatter.parseDateTime ( input );
} catch ( e ) {
    throw new IllegalArgumentException ( e );
}
于 2016-01-09T00:30:46.397 回答
0

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

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

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

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

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

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

于 2016-01-09T00:10:06.133 回答