2011-08-01 427 views
14

我想用Java的SimpleDateFormat解析一個字符串到下面的代碼日期。Java的SimpleDateFormat返回意外的結果

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 

無法推理出來。誰能幫忙?

感謝的日期格式

回答

21

SimpleDateFormat解析了2011號2011作爲個月,因爲一個月(MM)是日期模式的第一部分。

如果添加2011個月到今年28,你一年195

2011個月167年7個月。 7月是第7個月。您將02指定爲當天,28指定爲年份,28 + 167 = 195,因此02 July 195是正確的。

+0

+1解釋爲什麼輸出是:'星期三07月02 00:00:00 IST 195' –

+1

+1給袋熊一個很好的解釋。 – mre

5

呼叫setLenient(false)。然後你會得到你的分析異常,如:

groovy:000> df = new java.text.SimpleDateFormat("MM-dd-yyyy") 
===> [email protected] 
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) 
     ... 

波希米亞是正確的,如果你不設置寬鬆屬性,則JDK將使出渾身解數使它給垃圾的意識:

groovy:000> df = new java.text.SimpleDateFormat("MM-dd-yyyy"); 
===> [email protected] 
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) 
     ... 
+4

他不問如何解決它,他問爲什麼打印出來,而不是解析異常 – RMT

+1

@RMT:是的,我知道,我編輯我的答案承認,然後改變它回答他的問題。 –

21

默認情況下,SimpleDateFormat是一個寬鬆,因此得到它的失敗,你需要做的:

dateFormat.setLenient(false) ; 

解析日期之前。然後,您將得到異常:

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

+1回答問題 – RMT

+1

@RMT它不回答問題。答案的內容沒有錯 - 非常有用的信息(thx @tim) - 但問題是「爲什麼輸出」,而不是「如何修復」 – Bohemian

+2

其實他想知道,「爲什麼有這樣的輸出,而不是例外」。所以原因是,setLenient設置爲true,而不是false。對於一個完美的答案,你應該把你的答案都放在一起! )。 – crusam