我写了一个简单的方法,将Date作为参数,然后分别判断它是否在冬天,分别返回true或false。
我通过" date" 2012-13-01作为论点。很明显,数组没有第13个元素,为什么我仍然得到一个返回值(这是假的)?
package calculation;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Calculation {
public static boolean isWinter(Date date){
final byte winter[] = {1,1,0,0,0,0,0,0,0,0,0,1};
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
System.out.println();
return (winter[calendar.get(Calendar.MONTH)] == 0) ? false : true;
}
public static void main(String[] args){
try {
Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2012-13-01");
System.out.println(date.toString());
System.out.println(isWinter(date));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
因为SimpleDateFormat.parse()
在13上滚动到下一年的1月。
您可以在自己的输出中看到这一点:
Tue Jan 01 00:00:00 CST 2013
稍后创建并查询Calendar
一个月时,它会返回0,它位于数组的边界内。
答案 1 :(得分:1)
您正在解析看似无效月份的日期,13,但默认情况下SimpleDateFormat
是" lenient",这意味着它会将第13个月解释为次年的第1个月。解析的实际日期是2013年1月1日。
没有IndexOutOfBoundsException
,因为1月的月份实际为0
(Calendar
和Date
s中的月份为0。
答案 2 :(得分:0)
从documentation开始,parse
使用日历生成日期。通过查看日历的documentation,我们发现:
Calendar有两种解释日历字段的模式,lenient和non-lenient。当日历处于宽松模式时,它接受比它产生的更广泛的日历字段值。
这意味着它接受13
作为一个月并简单地换行到1
,因此将二月设置为月份,因为宽松是SimpleDateFormat
类的默认模式。事实上,从上面的链接文档中,您会发现:
默认情况下,解析是宽松的
如果您希望在这种情况下抛出异常,请使用setLenient(false)
(请参阅here获取文档)。