2015-05-15 11 views
6

Dưới đây là mã của tôi để phân tích ngày sử dụng SimpleDateFormat với mẫu:SimpleDateFormat.parse() - tạo ra ngày sai cho ngày-định dạng khác nhau

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(); 
} 

Bạn có thể xem ngày mà tôi truyền cho phân tích cú pháp là khác nhau từ định dạng ngày tháng được chỉ định trong SimpleDateFormat. Trong trường hợp này tôi đã mong đợi loại excpetion như là định dạng khác nhau nhưng nó phân tích thành công với một số giá trị ngày khác nhau. Tôi nhận được đầu ra - Tue 22 Tháng Ba 00:00:00 IST 12

Khi tôi vượt qua định dạng tương tự như 2030/05/21 nó hoạt động tốt.

Các bạn có thể cho tôi biết cách tôi có thể ngăn những điều như vậy trong mã của mình không?

+1

Bạn phải sử dụng nghiêm ngặt trong trường hợp đó http: // stackoverflow.com/questions/13088140/java-how-to-parse-a-date-strictly –

+0

@NitinDandriyal: Không có chế độ nghiêm ngặt rõ ràng. Bạn phải tắt khoan dung. – Brian

+0

Tôi có nghĩa là nghiêm ngặt như là một thuật ngữ chung, đó là lý do tại sao cho các liên kết mà câu trả lời một cách thích hợp –

Trả lời

13

Về cơ bản bạn muốn SimpleDateFormat phải nghiêm ngặt, vì vậy hãy đặt mong manh thành sai.

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

Đáng buồn thiết lập giả dối là vẫn còn khoan dung. "2010/01/5" được phép cho mẫu "yyyy/MM/dd". 20100901andGarbage "được phép cho mẫu" yyyyMMdd ".Tôi đã thực hiện phần mở rộng của SimpleDateFormat nghiêm ngặt tại đây: http://stackoverflow.com/questions/16014488/simpledateformat-parse-ignores-the-number-of-characters-in -pattern/19503019 # 19503019 –

3

Nếu bạn có thể đủ khả năng sử dụng Java 8 lần API, định dạng của nó làm việc như mong đợi:

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(); 
} 

Output:

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) 
Các vấn đề liên quan