2015-05-22 8 views
6

Warum passiert das? Für den Monat und Tag, ich denke, Java den vorherigen gültigen Monat und Tag geht davon aus, aber ich verstehe nicht, warum Jahr 2.Java getDate 0000/00/00 seltsamen Wert zurückgeben

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

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

Ausgang ist:

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

verwirrt, was Sie versuchen zu tun ... –

+4

@ AliGajani Wahrscheinlich hoffen, eine _famous_ Frage zu stellen – radimpe

+8

Müll in, Müll raus. – aioobe

Antwort

14

Das Gregorianische Kalenderjahr nicht 0 0 entspricht

Jahr zu 1BCE hat (vor dem Common Era, auch als BC bekannt).

Da Sie 0 für den Monat und 0 für den Tag angeben, wird auf den vorherigen Monat und das vorherige Jahr zurückgesetzt.

I.e. 30-Nov-0002 BCE.

Date#toString does nicht enthalten BCE/CE-Suffix. In den allermeisten Fällen wäre dies überflüssig.

Wenn Sie arbeiten mit Daten, die weit zurück dann müssen Sie sich mit einem Historiker beraten.

4

Der Ausgangspunkt für Datum wäre 00010101 ei Jahr - 1 Monat - Jan und Datum - 1

Was Sie Eingabe gegeben ist 00000000

wird sta rt mit Monat - 00 bedeutet Jan - 1 dh Dezember

Tag 001 Dec - 1 dh 30th Nov

bedeutet Dies erklärt den ersten Teil der Ausgabe. Sun Nov 30 00:00:00 GMT

Das Jahr ist 00 das bedeutet Jahr 1 minus 1. dh 1 BC Und als Jahr rollt zurück eine andere Zeit für Monat und Datum sein 2 BC.

daher das Jahr als 2 gezeigt wird

4

Standardmäßig versucht SimpleDateFormat, selbst falsche Eingaben zu analysieren. Sie können dies ausschalten mit setLenient Methode:

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

diese Weise erhalten Sie eine Ausnahme haben, die wahrscheinlich besser geeignet, in Ihrem Fall ist:

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)