我期待以下代码和输入抛出异常:
SimpleDateFormat getDateTimeFormat(String requiredFormat)
{
SimpleDateFormat dateTimeFormat = new SimpleDateFormat(requiredFormat);
//this will make sure that if parsing fails exception is thrown
dateTimeFormat.setLenient(false);
return dateTimeFormat;
}
Date date = getDateTimeFormat("MM/dd/yyyy HH:mm").parse(estimatedDeliveryDttm);
输入:10/25/16 17:46
我期待一个解析异常,因为年份没有给出'yyyy',但我得到的年份为'0016',我不想要。 我不能使用JAVA 8.我已经尝试过JAVA 7(包括解析位置方法)和JODA Date Time API。
答案 0 :(得分:2)
年度:如果格式化程序的日历是阳历,那么 应用以下规则。
对于格式化,如果是图案的数量 字母是2,年份被截断为2位数;否则就是 解释为数字。
用于解析,如果是模式字母的数量 超过2,年份按字面解释,无论如何 位数。所以使用模式“MM / dd / yyyy”,“01/11/12”解析 到1月11日,12 A.D。
使用缩写的年份模式进行解析(“y” 或者“yy”),SimpleDateFormat必须解释缩写的年份 相对于某个世纪。它通过调整日期来实现这一点 在SimpleDateFormat之前的80年和之后的20年 实例已创建。例如,使用“MM / dd / yy”和a的模式 1997年1月1日创建的SimpleDateFormat实例,字符串 “01/11/12”将被解释为2012年1月11日的字符串 “05/04/64”将被解释为1964年5月4日。仅在解析期间 由两个数字组成的字符串,由...定义 Character.isDigit(char)将被解析为默认世纪。任何 其他数字字符串,例如一位数字符串,三位或更多字符串 数字字符串,或不是所有数字的两位数字符串(for 例如,“-1”),按字面解释。所以“01/02/3”或“01/02/003” 使用相同的模式解析,如公元1月2日。同样,“01/02 / -3”被解析为公元前1月2日。
请参阅上面的粗体点,它解释了您所看到的行为。