2011-08-01 46 views
14

Tôi đang cố gắng sử dụng SimpleDateFormat của Java để phân tích cú pháp một chuỗi cho đến ngày với mã sau.Java SimpleDateFormat trả lại kết quả không mong muốn

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

Tôi đã mong đợi một số lỗi phân tích cú pháp. Nhưng thú vị, nó in chuỗi sau.

Wed Jul 02 00:00:00 IST 195 

Không thể giải thích được. Có ai giúp được không?

Cảm ơn

Trả lời

21

SimpleDateFormat đã phân tích cú pháp 2011 như tháng số năm 2011, vì tháng (MM) là phần đầu tiên của mô hình ngày.

Nếu bạn thêm 2011 tháng đến năm 28, bạn nhận được năm 195.

2011 tháng là 167 năm và 7 tháng. Tháng 7 là tháng thứ 7. Bạn đã chỉ định 02 là ngày, 28 là năm, 28 + 167 = 195, vì vậy 02 July 195 là chính xác.

+0

+1 để giải thích lý do tại sao đầu ra là: 'Wed Jul 02 00:00:00 IST 195' –

+1

+1 Để wombat cho một lời giải thích tuyệt vời. – mre

5

Gọi setLenient(false) trên DateFormat. Sau đó, bạn sẽ nhận được ngoại lệ phân tích cú pháp của bạn, như thế này:

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) 
     ... 

Bohemian là đúng, nếu bạn không thiết lập thuộc tính nhân hậu thì JDK sẽ uốn cong về phía sau làm cho ý nghĩa của rác nó đưa ra:

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

hes không hỏi cách khắc phục, anh hỏi tại sao in ra và không phải là một ngoại lệ phân tích cú pháp – RMT

+1

@RMT: vâng, tôi biết, tôi đã chỉnh sửa câu trả lời của mình để xác nhận rằng, sau đó thay đổi nó để trả lời câu hỏi của mình. –

21

Theo mặc định, SimpleDateFormat rất nhân hậu, vì vậy để làm cho nó thất bại, bạn cần làm:

dateFormat.setLenient(false) ; 

trước khi phân tích cú pháp ngày. Sau đó bạn sẽ nhận được ngoại lệ:

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

+1 để trả lời câu hỏi – RMT

+1

@RMT không trả lời được câu hỏi. Không có gì sai với nội dung của câu trả lời - thông tin khá hữu ích (thx @tim) - nhưng câu hỏi là "tại sao đầu ra", không "cách sửa" – Bohemian

+2

Thực ra anh ta muốn biết, "tại sao có đầu ra đó thay vì ngoại lệ". Vì vậy, lý do cho điều này là, setLenient được đặt thành true, thay vì false. Đối với một câu trả lời hoàn hảo, bạn nên dính cả hai câu trả lời của bạn với nhau! ;). – crusam

Các vấn đề liên quan