使用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?
使用值为false
的SimpleDateFormat#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.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
- Java SE 8和SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
- 请参见如何使用ThreeTenABP ….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。