我有一个字符串格式~8.8E15
的日期,我需要使用前提条件google guava class进行验证。我在很多其他地方使用YYYY/MM/DD HH:MM:SS
方法。如何使用checkArgument
方法验证checkArgument
以确保它仅采用此格式startDate
,如果不是,则抛出IllegalArgumentException并显示一些消息。
YYYY/MM/DD HH:MM:SS
我如何在这里使用checkArgument方法?
答案 0 :(得分: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会解释如何针对这些需求调整此答案。
答案 1 :(得分:1)
The Answer by Louis Wasserman是正确的。他提到避免使用java.util.Date。
java.util.Date类及其合作伙伴java.util.Calendar已在Java 8及更高版本的java.time框架中取代。请参阅Oracle Tutorial。
我们使用DateTimeFormatter
和DateTimeParseException
类。包含在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 );
}
答案 2 :(得分:0)
您可以针对正则表达式测试整个字符串:
Preconditions.checkArguments(str.matches(VALID_DATE_REGEX));
为了加快速度,您可以编译一次Pattern并反转调用
Preconditions.checkArgument(VALID_DATE_REGEX.matcher(str).matches());
然而这是一种气味。你不应该在你的程序中来回传递这一串文本:如果你需要这种格式,那只是因为在某些时候你将它转换为日期。因此,您最好确定您的程序是否可以接受无效输入并将其报告给用户,或者是否应立即终止。
后者更容易处理:立即解析文本并为无效输入抛出异常。否则,您需要在程序中引入验证步骤,然后编写一种方法来停止流程并向用户显示输入中的任何阻塞和非阻塞错误。