2010-06-11 58 views
4

模式是「dd-MM-yyyy」這是一個Java的DateFormat錯誤?

我認爲字符串「01-01-2010mwwwwwwwwwwwwwww」不符合該模式,但下面的代碼顯示相反。

任何人都可以解釋爲什麼?

public static void main(String[] args) throws Exception { 

    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy"); 

    Date date = df.parse("01-01-2010mwwwwwwwwwwwwwww"); 

    System.out.println(date); 
} 

感謝

+1

不幸的是,DateFormat靜靜地解析這個。 – 2010-06-11 20:31:55

+2

NAPWAD(不是一個問題按設計工作) – 2010-06-11 20:36:03

回答

16

parse方法不會嘗試匹配整個輸入字符串。也就是說,前綴01-01-2010匹配,這就夠了。

DateFormat.parse

從給定字符串產生日期的開始解析文本。 該方法可能不會使用給定字符串的整個文本。


如果需要搞清楚,如果這是一個 「完全匹配」,你可以嘗試以下方法:

SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy"); 

String strDate = "01-01-2010mwwwwwwwwwwwwwww"; 
ParsePosition pp = new ParsePosition(0); 
Date date = df.parse(strDate, pp); 
System.out.println("Complete match: " + (pp.getIndex() == strDate.length())); 

strDate = "01-01-2010"; 
pp = new ParsePosition(0); 
date = df.parse(strDate, pp); 
System.out.println("Complete match: " + (pp.getIndex() == strDate.length())); 

這將打印

Complete match: false 
Complete match: true 
+1

謝謝,這就是正確的答案。 – anonymous 2010-06-11 20:47:48

0

這是因爲DateFormat的默認lenient參數爲true。這意味着解析器將解析輸入字符串,即使格式不正確。哪(有時)會導致不正確的結果。

另一方面,我們可以強制解析器對給定模式嚴格。這意味着一個不正確的輸入字符串會引發異常。

public static void main(String[] args) throws Exception { 
    SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy"); 
    df.setLenient(false); // Switch to strict mode 
    Date date = df.parse("01-01-2010mwwwwwwwwwwwwwww"); // This will throw an exception 
    System.out.println(date); 
} 
+0

這個答案根本就是錯誤的,因爲結果與寬大的旗幟無關。 – 2014-09-29 11:02:09