为什么我要用无效的小时来解析Java中的日期时间字符串?我错过了或需要做些什么来确保它适当地引发错误。
以下代码不会在应该出现的地方引发错误?
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss");
LocalDateTime aFormattedDate = LocalDateTime.parse("2019-01-01T24:00:00", dateTimeFormatter); // returns 2019-01-02T00:00:00, should throw an error
将小时指定为25,或包含任何毫秒或其他时间分量,确实会导致parse
引发错误。
为
LocalDateTime aDate = LocalDateTime.parse("2019-01-01T24:00:00"); //throws an error
是否抛出错误-预期HourOfDay必须介于0到23之间-如预期
答案 0 :(得分:4)
ResolverStyle
因为如果未指定解析器样式,则DateTimeFormatter.ofPattern()
默认为ResolverStyle.SMART
。 SMART
允许进行一些转换,例如。 24:00:00
将转换为第二天,但24:00:01
将引发异常。按照枚举javadoc:
一种样式,以一种聪明的方式解决日期和时间。
使用智能分辨率将对每个字段执行明智的默认设置,这可能与严格,宽松或第三种行为相同。各个字段的解释会有所不同。
例如,使用智能模式在ISO日历系统中解析年月和月日,将确保月日从1到31,将超出最后一个有效日期的任何值转换为月份为最后一个有效的月份。
LocalDateTime.parse()
在引擎盖下使用ResolveStyle.STRICT
,等同于:
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss")
.withResolverStyle(ResolverStyle.STRICT);
LocalDateTime.parse("2019-01-01T24:00:00", fmt); // DateTimeParseException