Java SimpleDataFormat返回意外结果

Java SimpleDataFormat返回意外结果,java,simpledateformat,Java,Simpledateformat,我尝试使用Java的SimpleDataFormat来解析一个字符串,直到现在为止,代码如下 public class DateTester { public static void main(String[] args) throws ParseException { String dateString = "2011-02-28"; SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-

我尝试使用Java的SimpleDataFormat来解析一个字符串,直到现在为止,代码如下

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
无法解释。有人能帮忙吗

谢谢

致电
setLenient(false)
查看dateFormat。然后您将得到解析异常,如下所示:

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)
        ...
Bohemian是对的,如果您不设置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)
        ...

默认情况下,SimpleDataFormat是宽松的,因此要使其失败,您需要执行以下操作:

dateFormat.setLenient( false ) ;
在解析日期之前。然后您将获得异常:

java.text.ParseException: Unparseable date: "2011-02-28"

SimpleDataFormat
已将
2011
解析为2011年的月号,因为月(
MM
)是日期模式的第一部分

如果你把2011个月加到第28年,你就得到了第195年


2011年为167年零7个月。七月是第七个月。您指定02为日期,28为年份,28+167=195,因此
02 195年7月
是正确的

他不是问如何修复它,他是问为什么是打印出来的而不是解析exception@RMT:是的,我知道,我编辑了我的答案以确认这一点,然后将其更改为回答他的问题。+1用于解释为什么输出为:
Wed Jul 02 00:00:00 IST 195
@RMT它没有回答问题。答案的内容没有问题-非常有用的信息(thx@tim)-但问题是“为什么会有输出”,而不是“如何修复”,实际上他想知道,“为什么会有输出而不是异常”。原因是,setLenient设置为true,而不是false。为了得到一个完美的答案,你应该把两个答案粘在一起!;)。我的实际问题由@Bohemian回答,但这一个也提供了非常有价值的信息。所以,这个是+1。