我正在尝试使用Java的SimpleDateFormat来解析使用以下代码的String。
public class DateTester {
public static void main(String[] args) throws ParseException {
String dateString = "2011-02-28";
SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy");
System.out.println(dateFormat.parse(dateString));
}
}
我原本期待一些解析错误。但有趣的是,它会打印以下字符串。
Wed Jul 02 00:00:00 IST 195
无法推理出来。有人可以帮忙吗?
由于
答案 0 :(得分:23)
默认情况下,SimpleDateFormat是宽松的,因此要使其失败,您需要执行以下操作:
dateFormat.setLenient( false ) ;
在解析日期之前。然后您将获得例外:
java.text.ParseException: Unparseable date: "2011-02-28"
答案 1 :(得分:22)
SimpleDateFormat
已将2011
解析为月编号2011,因为月份(MM
)是日期模式的第一部分。
如果您将2011个月添加到第28年,则可获得195年。
2011个月是167年零7个月。七月是第七个月。您将02指定为日,将28指定为年,28 + 167 = 195,因此02 July 195
是正确的。
答案 2 :(得分:5)
在dateFormat上调用setLenient(false)
。然后你会得到你的解析异常,如下所示:
groovy:000> df = new java.text.SimpleDateFormat("MM-dd-yyyy")
===> java.text.SimpleDateFormat@ac880840
groovy:000> df.setLenient(false)
===> null
groovy:000> df.parse("2011-02-28")
ERROR java.text.ParseException:
Unparseable date: "2011-02-28"
at java_text_DateFormat$parse.call (Unknown Source)
at groovysh_evaluate.run (groovysh_evaluate:2)
...
波西米亚是正确的,如果你没有设置lenient属性,那么JDK会向后弯腰,理解它给出的垃圾:
groovy:000> df = new java.text.SimpleDateFormat("MM-dd-yyyy");
===> java.text.SimpleDateFormat@ac880840
groovy:000> df.parse("13-01-2011")
===> Sun Jan 01 00:00:00 CST 2012
groovy:000> df.setLenient(false)
===> null
groovy:000> df.parse("13-01-2011")
ERROR java.text.ParseException:
Unparseable date: "13-01-2011"
at java_text_DateFormat$parse.call (Unknown Source)
at groovysh_evaluate.run (groovysh_evaluate:2)
...