2015-05-15 69 views
6

下面是我的代碼來解析使用的SimpleDateFormat與模式日期:SimpleDateFormat.parse() - 生成不同的日期格式錯誤的日期

String pattern = "yyyy-MM-dd";  
SimpleDateFormat format = new SimpleDateFormat(pattern); 
try { 
    Date date = format.parse("05-21-2030"); 
    System.out.println(date); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 

你可以看到,我通過解析日期是不同的日期格式在SimpleDateFormat中指定。在這種情況下,由於格式不同,我期待有一些改變,但它用一些不同的日期值成功解析。我得到的輸出 - 週二3月22日00:00:00北京時間12

當我傳似2030年5月21日相同的格式,它工作正常。

你們可以請讓我知道如何防止我的代碼中的這樣的事情?

+1

你必須使用在這種情況下HTTP嚴格:// stackoverflow.com/questions/13088140/java-how-to-parse-a-date-strictly –

+0

@NitinDandriyal:沒有明確的嚴格模式。你必須關閉寬大處理。 – Brian

+0

我的意思是嚴格的作爲一個通用術語,這就是爲什麼給出適當回答的鏈接 –

回答

13

基本上你想SimpleDateFormat是嚴格的,所以從寬鬆到假。

SimpleDateFormat format = new SimpleDateFormat(pattern); 
format.setLenient(false); 
+0

可悲的是,設置寬鬆的虛假仍然是寬鬆的。 「2010/01/5」可以用於「yyyy/MM/dd」模式。 20100901andGarbage「可以用於模式」yyyyMMdd「。我在這裏對SimpleDateFormat進行了嚴格的擴展:http://stackoverflow.com/questions/16014488/simpledateformat-parse-ignores-the-number-of-characters-in -pattern/19503019#19503019 –

3

如果你能負擔得起使用Java 8時API,它的格式按預期工作:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 
try { 
    LocalDate date = LocalDate.parse("2030-05-21", formatter); 
    System.out.println(date); 
    LocalDate date2 = LocalDate.parse("05-21-2030", formatter); 
    System.out.println(date2); 
} catch (DateTimeParseException e) { 
    e.printStackTrace(); 
} 

輸出:

2030-05-21 
java.time.format.DateTimeParseException: Text '05-21-2030' could not be parsed at index 0 
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947) 
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849) 
    at java.time.LocalDate.parse(LocalDate.java:400) 
    at java8.Snippet.main(Snippet.java:25)