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
我期待一个例外。
答案 0 :(得分:11)
SimpleDateFormat
的Javadoc有关于重复模式字母的说法:
数字:对于格式化,模式字母的数量是最小位数,较短的数字是零填充到此数量。 对于解析,忽略模式字母的数量,除非需要将两个相邻的字段分开
(强调我的)
所以用于解析,"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中的新代码,最好避免使用旧的Date
和Calendar
类。如果可以,请使用LocalDateTime.parse(CharSequence text, DateTimeFormatter formatter)
。