使用java Date和SimpleDateFormatvalidation范围

嘿伙计们,我想知道当我尝试使用此代码解析日期时是否有可以处理的Dateexception:

try{ SimpleDateFormat df = new SimpleDateFormat("dd:MM:yyyy"); Date date = df.parse(dateRelease); }catch (ParseException e) {} 

好吧,如果“dateRelease”不是正确的格式类型,它会抛出ParseException,但是如果有人写“40/03/2010” – 我想知道错误的日期,月份或年份无效范围。 实际上,当发送无效日期时,SimpleDateFormat只会创建一个带有默认数字的新日期。

我是否必须使用正则表达式创建我自己的方法来处理它,或者是否存在一个告诉我要捕获它的现有exception?

使用值为falseSimpleDateFormat#setLenient()使其不宽松。

 SimpleDateFormat df = new SimpleDateFormat("dd:MM:yyyy"); df.setLenient(false); Date date = df.parse(dateRelease); 

然后,当日期不在有效范围内时,它将抛出ParseException

TL;博士

 try { LocalDate localDate = LocalDate.parse( "40:03:2010" , // "40:03:2010" is bad input, "27:03:2010" is good input. DateTimeFormatter.ofPattern( "dd:MM:uuuu" ) ) ; } catch ( DateTimeParseException e ) { … // Invalid input detected. } 

使用java.time

现代方法是使用Java 8及更高版本内置的java.time类。

您的示例数据与示例代码中显示的格式不匹配。 一个使用SOLIDUS(斜杠)字符,另一个使用COLON字符。 我会和科隆一起去。

DateTimeFormatter

定义格式模式以匹配输入字符串。

 DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd:MM:uuuu" ); 

LocalDate

解析为LocalDate对象,因为输入没有时间和没有时区。

 LocalDate localDateGood = LocalDate.parse( "27:03:2010" , f ); System.out.println( "localDateGood: " + localDateGood ); 

现在尝试一些不好的输入。 陷阱适当的例外。

 try { LocalDate localDateBad = LocalDate.parse( "40:03:2010" , f ); } catch ( DateTimeParseException e ) { System.out.println( "ERROR - Bad input." ); } 

请参阅此代码在IdeOne.com中运行 。

localDateGood:2010-03-27

错误 – 输入错误。

ISO 8601

在将日期时间值作为文本交换/存储时,请使用标准ISO 8601格式。 标准格式是合理的,实用的,易于被各种文化的人阅读,并且易于机器解析。

对于仅日期值,标准格式为YYYY-MM-DD,例如2010-03-27

在解析/生成字符串时,java.time类在默认情况下使用标准ISO 8601格式。 因此, 根本不需要指定格式化模式

 LocalDate localDate = LocalDate.parse( "2010-03-27" ); String output = localDate.toString(); // 2010-03-27 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。