2015-07-03 49 views
4

我有以下行:SimpleDateFormat的行为

final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
Date d = simpleDateFormat.parse("2004-52-05"); 

我期望的异常将在第2行被抛出,因为“52”不是一个有效的一个月,但代码运行和日期保存在d对象是

Sat Apr 05 00:00:00 EEST 2008 

有人可以解释我为什么吗?

+1

我相信这是因为它被设置为52个月,这将是2008年4月(4年4个月)。为什么没有错误的人可以回答。 – AlasdairCM

+0

@Hiru比我的更好的解释! – AlasdairCM

回答

9

如果要创建严格匹配 模式的日期对象,请将lenient设置为false。

从的Javadoc

日历具有解释日历字段,宽松 和非宽松的两种模式。当日历处于宽松模式时,它会接受比其生成的日历域值更大范围的 。当日历 重新计算日历字段值以便get()返回时,所有 日历字段都将被标准化。例如,一个宽松的 GregorianCalendar的解释MONTH == JANUARY,DAY_OF_MONTH == 32 2月1日

请参阅本作的更多信息lenitent

所以添加这个..

simpleDateFormat.setLenient(false); 

这会抛出一个Exception像你期待的那样。

java.text.ParseException: Unparseable date: "2004-52-05"