2015-05-22 15 views
6

Tại sao điều này xảy ra? Trong tháng và ngày, tôi nghĩ rằng Java là giả định các tháng hợp lệ trước đây và ngày, nhưng tôi không hiểu tại sao năm là 2.Java getDate 0000/00/00 trả lại giá trị lạ

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); 
Date result = sdf.parse("0000/00/00"); 

System.out.println(result.toString()); 

Output là:

Sun Nov 30 00:00:00 GMT 2 
+3

Confused những gì bạn đang cố gắng làm ... –

+4

@AliGajani Có lẽ hy vọng sẽ hỏi một câu hỏi _famous_ – radimpe

+8

Rác vào, đổ rác ra. – aioobe

Trả lời

14

Lịch Gregorian không có năm 0.

Năm 0 tương ứng với 1BCE (Trước Common Era, còn được gọi là BC).

Vì bạn cung cấp 0 cho tháng và 0 cho ngày, nó quay trở lại tháng trước và năm trước đó.

I.e. 30 tháng 11 năm 0002 trước Công nguyên.

Date#toString không không bao gồm hậu tố BCE/CE. Nó sẽ là thừa trong phần lớn các trường hợp.

Nếu bạn định làm việc với những ngày xa về sau, bạn cần tham khảo ý kiến ​​của một nhà sử học.

4

Điểm khởi đầu cho ngày sẽ 00010101 ei Năm - 1, Tháng - Jan và ngày - 1

gì bạn đã cho đầu vào là 00000000

sẽ sta rt với tháng - 00 có nghĩa Jan - 1 tức là tháng mười hai

ngày 00 nghĩa 1 Dec - 1 tức 30th Nov

này giải thích phần 1 của đầu ra. Sun Nov 30 00:00:00 GMT

Năm được cấp 00 có nghĩa là năm 1 trừ đi 1. tức là 1 BC Và khi năm quay trở lại vào một thời điểm khác trong tháng và ngày là 2 TCN.

Do đó năm nay được thể hiện như 2.

4

Theo mặc định SimpleDateFormat cố gắng phân tích cú pháp ngay cả đầu vào không chính xác. Bạn có thể tắt cài đặt này sử dụng phương pháp setLenient:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); 
sdf.setLenient(false); 
Date result = sdf.parse("0000/00/00"); 

Bằng cách này bạn sẽ có một ngoại lệ mà có lẽ thích hợp hơn trong trường hợp của bạn:

Exception in thread "main" java.text.ParseException: Unparseable date: "0000/00/00" 
    at java.text.DateFormat.parse(DateFormat.java:366) 
    at Snippet.main(Snippet.java:11)