2015-05-22 10 views
6

Dlaczego tak się dzieje? Za miesiąc i dzień, myślę, że Java jest przy założeniu, że poprzedni ważny miesiąc i dzień, ale nie rozumiem, dlaczego rok 2.Java getDate 0000/00/00 zwraca dziwną wartość

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

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

wyjściowa wynosi:

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

Confused, co próbujesz zrobić ... –

+4

@AliGajani Prawdopodobnie ma nadzieję, że zadam _famous_ pytanie – radimpe

+8

Wyrzucam, wyrzucam. – aioobe

Odpowiedz

14

kalendarz gregoriański nie posiada Rok 0.

Rok 0 odpowiada 1BCE (przed naszą erą, znany również jako pne).

Ponieważ podajesz 0 dla miesiąca i 0 dla dnia, następuje powrót do poprzedniego miesiąca i poprzedniego roku.

tj. 30-lis-0002 pne.

Date#toString ma nie zawierają sufiks BCE/CE. Byłoby to w większości przypadków zbyteczne.

Jeśli zamierzasz pracować z datami, które nastąpiły w przeszłości, musisz skonsultować się z historykiem.

4

Punktem wyjścia dla data byłaby 00010101 ei Rok - 1 miesiąc - Jan i data - 1

Co dałeś wejście jest 00000000

Will sta rt z miesiąca - 00 oznacza Jan - 1 tj gru

Dzień 00 oznaczać 1 Dec - 1 tj 30th Nov

Wyjaśnia to 1st część produkcji. Sun Nov 30 00:00:00 GMT

Rok ten oznaczony jest jako 00, co oznacza rok 1 minus 1. tj. 1 pne A rok cofa się o kolejny miesiąc i datę 2 BC.

Stąd roku jest pokazany jako 2.

4

Domyślnie SimpleDateFormat próbuje przeanalizować nawet niepoprawne dane wejściowe. Można przełączać się to wyłączyć za pomocą metody: setLenient

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

ten sposób będziesz mieć wyjątek, który jest prawdopodobnie bardziej odpowiedni w danym przypadku:

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) 
Powiązane problemy