2009-12-15 26 views
40

Tôi đang sử dụng java.text.SimpleDateFormat để phân tích các chuỗi của biểu mẫu "yyyyMMdd".Làm cho SimpleDateFormat.parse() thất bại vào các ngày không hợp lệ (ví dụ: tháng lớn hơn 12)

Nếu tôi cố gắng phân tích chuỗi bằng một tháng lớn hơn 12, thay vì thất bại, nó sẽ chuyển sang năm tiếp theo. Full Runnable repro:

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class ParseDateTest { 

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

     SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); 
     Date result = format.parse("20091504"); // <- should not be a valid date! 
     System.out.println(result); // prints Thu Mar 04 00:00:00 CST 2010 
    } 
} 

Tôi thà có một ParseException ném.

Có cách nào không hacky buộc buộc ngoại lệ xảy ra không ?. Ý tôi là, tôi không muốn kiểm tra bằng tay nếu tháng đó lớn hơn 12. Đó là loại vô lý.

Cảm ơn mọi đề xuất.

LƯU Ý: Tôi đã biết về Thời gian Joda, nhưng tôi cần điều này được thực hiện trong JDK thuần túy mà không có thư viện bên ngoài.

Trả lời

96

Bạn cần làm cho nó non-lenient. Do đó,

format.setLenient(false); 

nên làm điều đó.

+6

Thanks a lot. Điều đó đã làm các trick. Tuyệt vời như thế nào đặt câu hỏi ở đây cho kết quả nhanh hơn so với tìm kiếm trên google (hoặc tôi suck lúc tìm kiếm :). –

+2

+1 cho một lớp lót. –

+2

stackoverflow nên cho phép người dùng cung cấp cho hơn 1 điểm để trả lời và đây là một trong những câu trả lời. Tôi đã làm một số mẫu phù hợp vô lý trước khi phân tích cú pháp với 'SimpleDateFormat'. Cảm ơn rất nhiều. –

3

Bạn có thể sử dụng API thời gian Java 8. Nếu bằng ví dụ bạn sử dụng một tháng với giá trị 15:

String strDate = "20091504"; 
TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyyMMdd").parse(strDate); 

Bạn sẽ trực tiếp có một ngoại lệ

Exception in thread "main" java.time.format.DateTimeParseException: 
Text '20091504' could not be parsed: 
Invalid value for MonthOfYear (valid values 1 - 12): 15 
Các vấn đề liên quan