Java:如何严格解析日期?

Pav*_*sov 20 java validation parsing date

SimpleDateFormat是一种非常友好的解析器,可以滚动生成的日期而不是抛出错误.如何在没有正则表达式等的情况下严格解析日期?

fmt = new SimpleDateFormat("dd.MM.yyyy")
fmt.parse("10.11.2012")   // it works
fmt.parse("10.1150.2012") // it works but it's unwanted
Run Code Online (Sandbox Code Playgroud)

sp0*_*00m 32

fmt.setLenient(false); 是你在找什么.

  • 可悲的是,设置宽大的虚假仍然是宽大的."yyyy/MM/dd"模式允许使用"2010/01/5".20100901andGarbage"允许使用模式"yyyyMMdd".我发布了一个答案,使用扩展SimpleDateFormat的类来保证严格匹配. (7认同)

Ort*_*kni 12

java.time

您还可以在Java 8及更高版本(教程)中使用java.time包.它的解析严格检查日期值.

例如:

String strDate = "20091504";
TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyyMMdd").parse(strDate);
Run Code Online (Sandbox Code Playgroud)

直接给出:

Exception in thread "main" java.time.format.DateTimeParseException:
Text '20091504' could not be parsed:
Invalid value for MonthOfYear (valid values 1 - 12): 15
Run Code Online (Sandbox Code Playgroud)

  • `DateTimeFormatter` 具有三种解析器样式(与 `DateFormat` 的两种相比):严格、智能和宽松。幸运的是 smart 是默认设置,它会捕获大多数不需要的输入,以及可能所有明显不正确的输入。对于更严格的验证,您当然可以尝试严格的解析器样式。[文档](http://docs.oracle.com/javase/8/docs/api/java/time/format/ResolverStyle.html) 提供了相当多的信息。 (2认同)