为什么 SimpleDateFormat 不会为无效格式抛出异常?


import java.text.ParseException;
public class Hello {
public static void main(String[] args) throws ParseException {
System.out.println(new java.text.SimpleDateFormat("yyyy-MM-dd").parse("23-06-2015"));
}
}

为什么这会返回Sun Dec 05 00:00:00 GMT 28我期待例外。

Javadoc forSimpleDateFormat对重复的模式字母有这样的说法:

数字:对于格式设置,图案字母的数量是最小位数,较短的数字在此数量上填充为零。对于解析,除非需要分隔两个相邻字段,否则将忽略模式字母的数量

(强调我的(

所以对于解析,"yyyy-MM-dd"等同于"y-M-d"

使用此模式,"23-06-2015"被解析为year = 23, month = 6, dayOfMonth = 2015

默认情况下,此问题通过从 0023 年 6 月 1 日开始,向前计算 2015 天,将您带到 12 月 5 日 0028 来解决。

您可以使用SimpleDateFormat.setLenient(false)更改此行为 - 禁用宽大处理后,它将为超出范围的号码引发异常。这在Calendar.setLenient()中得到了适当的记录


请注意,对于 Java 8 中的新代码,最好避免使用旧的DateCalendar类。如果可以,请使用LocalDateTime.parse(CharSequence text, DateTimeFormatter formatter)

最新更新