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

Ami*_*mit 9 java parsing 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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么这会回来Sun Dec 05 00:00:00 GMT 28我期待一个例外.

sli*_*lim 13

Javadoc for SimpleDateFormat有关于重复模式字母的说法:

数字:对于格式化,模式字母的数量是最小位数,较短的数字是零填充到此数量.对于解析,除非需要分隔两个相邻字段,否则将忽略模式字母的数量

(强调我的)

所以对于解析,"yyyy-MM-dd"相当于"y-M-d".

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

默认情况下,从0023年6月1日开始计算,并计算2015年前的日期,将您带到0028年12月5日.

你可以改变这种行为SimpleDateFormat.setLenient(false)- 如果禁用宽容,它将为超出范围的数字抛出异常.这是正确记录的Calendar.setLenient()


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

  • 另外如果要读取`DateFormat`类中的`parse`方法的JavaDoc,你可以看到下一个:*默认情况下,解析是宽松的:如果输入不是这个对象的格式方法使用的形式,但仍然可以解析为一个日期,然后解析成功.客户可以通过调用setLenient(false)坚持严格遵守格式.* (2认同)