Was ist der beste Weg, um ein Datum im Format MM / TT / JJ-Format und stellen Sie es auf den aktuellen / vorigen Jahrhunderts zu analysieren?

StackOverflow https://stackoverflow.com/questions/251535

  •  05-07-2019
  •  | 
  •  

Frage

Einer unserer Kunden will in der Lage sein, ein Datum einzugeben, um mit nur zwei Ziffern für die Jahreskomponente. Das Datum wird in der Vergangenheit sein, so dass wir wollen, dass es für das vergangene Jahrhundert arbeiten, wenn das 2-stellige Jahr nach dem laufenden Jahr, sondern für das aktuelle Jahrhundert arbeitet, wenn das 2-stellige Jahr gleich oder kleiner als das laufende Jahr.

ab heute 10/30/2008

01/01/01 = 01.01.2001

01/01/09 = 1909.01.01

Das ist eine seltsame Forderung, und ich löste das Problem, Ich mag einfach nicht meine Lösung. Es fühlt sich an wie es ein besserer Weg, dies zu tun.

Danke für die Hilfe.

public static String stupidDate(String dateString)
{
    String twoDigitYear = StringUtils.right(dateString, 2);
    String newDate = StringUtils.left(dateString, dateString.length() - 2);
    int year = NumberUtils.toInt(twoDigitYear);
    Calendar c = GregorianCalendar.getInstance();
    int centuryInt = c.get(Calendar.YEAR) - year;
    newDate = newDate + StringUtils.left(Integer.toString(centuryInt), 2) + twoDigitYear;
    return newDate;
}
War es hilfreich?

Lösung

Groovy Skript (leicht genug, um in Java zu werfen) zeigt den Punkt @bobince gemacht über Simple.

import java.text.SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat('MM/dd/yy')
SimpleDateFormat fmt = new SimpleDateFormat('yyyy-MM-dd')

Calendar cal = Calendar.getInstance()
cal.add(Calendar.YEAR, -100)
sdf.set2DigitYearStart(cal.getTime())

dates = ['01/01/01', '10/30/08','01/01/09']
dates.each {String d ->
  println fmt.format(sdf.parse(d))
}

Die Ausbeuten

2001-01-01
2008-10-30
1909-01-01

Andere Tipps

Simple bereits tut zweistelliges Jahr für Sie Parsen, mit dem aus zwei Buchstaben ‚JJ‘ Format. (Es wird noch vier Ziffern ermöglichen, natürlich.)

Standardmäßig verwendet es jetzt-80 → jetzt + 20, also ist es nicht genau die gleiche Regel, die Sie vorschlagen, aber es ist sinnvoll und standardisiert (in der Java-Welt zumindest), und außer Kraft gesetzt werden kann mit set2DigitYearStart (), wenn Sie möchten, .

DateFormat informat= new SimpleDateFormat("MM/dd/yy");
DateFormat outformat= new SimpleDateFormat("MM/dd/yyyy");
return outformat.format(informat.parse(dateString));

Auf längere Sicht, versuchen zu ISO8601 Datumsformatierung (yyyy-MM-dd) zu migrieren, weil MM / TT / JJ etwa das schlimmstmögliche Datumsformat ist und gebunden ist schließlich zu Problemen führen.

Date deliverDate = new SimpleDateFormat("MM/dd/yy").parse(deliverDateString);
String dateString2 = new SimpleDateFormat("yyyy-MM-dd").format(deliverDate);

für mich arbeiten.

Der beste Weg ist, um die Joda Zeit API für Daten und Zeiten in Java zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top