Louis Wasserman的回答 是正确的。他提到避免使用java.util.Date。
java.util.Date类及其合作伙伴java.util.Calendar已在Java 8及更高版本中取代了 java.time 框架。见 Oracle教程 。
我们用 DateTimeFormatter 和 DateTimeParseException 而是改为。包含在 java.time.format 包。
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库添加到项目中。 乔达时间 为java.time提供了灵感,这两个框架共享相同的概念。
Wasserman的逻辑相同 适用于我们的解决方案:进行解析尝试,并捕获异常。我们用的是 DateTimeFormatter 来自Joda-Time的类,它抛出一个标准的Java IllegalArgumentException 遇到错误的输入时。
IllegalArgumentException
try { DateTimeFormatter formatter = DateTimeFormat.forPattern ( "yyyy/MM/dd HH:mm:ss" ); DateTime dt = formatter.parseDateTime ( input ); } catch ( e ) { throw new IllegalArgumentException ( e ); }
您可以针对正则表达式测试整个字符串:
Preconditions.checkArguments(str.matches(VALID_DATE_REGEX));
为了加快速度,您可以编译一次Pattern并反转调用
Preconditions.checkArgument(VALID_DATE_REGEX.matcher(str).matches());
然而 的 这是一种气味 强> 。你不应该在你的程序中来回传递这一串文本:如果你需要这种格式,那只是因为在某些时候你会将它转换为日期。因此,您最好决定您的程序是否可以接受无效输入并将其报告给用户,或者是否应立即终止。
后者更容易处理:立即解析文本并为无效输入抛出异常。否则,您需要在程序中引入验证步骤,然后编写一种方法来停止流程并向用户显示输入中的任何阻塞和非阻塞错误。
别。写
try { new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse(startDate); } catch (ParseException e) { throw new IllegalArgumentException(e); }
..还会让你存放 Date 解析并稍后使用它。 (虽然,公平地说, java.util.Date 是一个可怕的API,最好避免 - 但你暗示你在之前的问题中使用它,你似乎删除了。)
Date
java.util.Date
如果你最终使用Joda Time, http://joda-time.sourceforge.net/userguide.html#Input_and_Output 解释了如何针对这些需求调整此答案。