2012-05-24 20 views
8

Ich versuche ein String im "TT-MM-JJ" -Format zu einem Date Objekt zu analysieren. Das Problem ist, dass es versucht, das Jahrhundert für das Datum zu erraten.Wie kann DateFormat das geplante Jahrhundert erraten?

Wenn von 01 bis 31 angegeben, wird das Jahr als 2000er (21. Jahrhundert) interpretiert und 32 bis 99 gilt als 1900s (20. Jahrhundert).

SimpleDateFormat fm =new SimpleDateFormat("dd-MM-yy"); 
String datestr="21-11-31"; 
try { 
    Date date= fm.parse(datestr); 
    System.out.println(date); 
} catch (ParseException e) { 
} 

Kann mir jemand helfen? Wie kann ich präzisieren, dass ich nur im 21. Jahrhundert sauber arbeite? Ich versuche nicht gerade, nach Tricks zu suchen, wie die Saite zu manipulieren oder das Datum basierend auf der Bedingung zu verschieben.

+0

Ich glaube, dass, wenn Sie alle wollen angeben, dass die Daten im 21. Jahrhundert sind, sind Sie tatsächlich wahrscheinlich besser eine dumme String-Manipulation zu tun. 's/([0-9] {2} - [0-9] {2}) - ([0-9] {2})/$ 1-20 $ 2 /'. – zebediah49

+0

Ich bin gespannt, warum die Eingabe im Kurzjahresformat ist. Können Sie die Eingabe im Long-Year-Format erhalten? Eine andere Möglichkeit ist das Hinzufügen von "20" in dem Jahrfeld unter Verwendung von Regex, bevor das Datum analysiert wird. (.replaceFirst ("- (?! -)", "-20") – nhahtdh

+0

Ich habe es nur durch Stringmanipulation implementiert nur gedacht, dass es eine Möglichkeit geben könnte, es zu tun – Edge

Antwort

12

Sie das Jahrhundert ändert es 2 Eingabestellen- Daten mit dem set2DigitYearStart() Verfahren zu interpretieren verwendet werden.

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yy"); 
String aDate = "03/17/40"; 
Calendar cal = Calendar.getInstance(); 
cal.clear(); 
cal.set(Calendar.YEAR, 2000); 
dateFormat.set2DigitYearStart(cal.getTime()); 
System.out.println(dateFormat.get2DigitYearStart()); 
System.out.println(dateFormat.parse(aDate)); 

Will 17. März drucken, 2040.

+1

+1 - Nizza finden. Hoffentlich kommt der Upvote Zug zurück :) –

+0

Ich war eigentlich auf der Suche nach diesem.Obwohl es chaotisch aussieht (wahrscheinlich werde ich nur bei der Stringmanipulation bleiben), aber es beantwortet meine beabsichtigte Frage, die ich nicht über get2DigitYearStart() wusste. Danke – Edge

+0

Wenn Sie nur Jahr 2000 einmal berechnen und in einer Fabrik behalten, können Sie die Kosten für Kalenderoperationen eliminieren und die Unordnung verbergen. Funktioniert in beiden Richtungen! – Affe

6

Vom documentation:

Denn mit dem abgekürzten Jahr-Muster („y“ oder „yy“) Parsen Simple muss die abgekürzte Jahr relativ zu einem Jahrhundert interpretieren. Dazu werden Daten so angepasst, dass sie innerhalb von 80 Jahren vor und 20 Jahre nach der Erstellung der SimpleDateFormat-Instanz liegen. Wenn Sie beispielsweise ein Muster aus "MM/TT/JJ" und eine SimpleDateFormat-Instanz verwenden, die am 1. Januar 1997 erstellt wurde, wird die Zeichenfolge "01/11/12" als Jan 11, 2012 interpretiert, während die Zeichenfolge "05/04/64 "würde als 4. Mai 1964 interpretiert werden. Während des Parsens werden nur Strings, die aus genau zwei Ziffern bestehen, wie von Character.isDigit (char) definiert, in das Standardjahrhundert geparst. Jede andere numerische Zeichenfolge, z. B. eine Zeichenfolge mit einer Ziffer, eine Zeichenfolge mit drei oder mehr Ziffern oder eine zweistellige Zeichenfolge, bei der es sich nicht um Ziffern handelt (z. B. "-1"), wird wörtlich interpretiert. So werden "01/02/3" oder "01/02/003" unter Verwendung des gleichen Musters wie am 2. Januar 3 AD analysiert. Ebenso wird "01/02/-3" als 2. Januar 4 v. Chr. Geparst.

Es scheint keine Möglichkeit zu geben, den [-80; +20] Bereich einzustellen. Ich vermute, dass die beste Wahl ist das zweistellige Jahr in die vierstelligen Form zu erweitern:

datestr = datestr.replaceFirst("-(\\d{2})$", "-20$1"); 
+0

Mai die API unsere segnen Verständnis dieser heiligen Worte. Amen. – zebediah49

+0

Ich verstehe das, aber es beantwortet meine Frage nicht wirklich. Können wir der JVM eine schöne Art mitteilen, wenn wir in dem bestimmten Jahrhundert arbeiten? – Edge

+0

@Edge: Siehe den Absatz am Ende meiner Antwort. – NPE

Verwandte Themen