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?
-
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;
}
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.
Wie wäre es damit:
public static String anEasierStupidDateWithNoStringParsing(String dateString) {
DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
//handling ParseExceptions is an exercise left to the reader!
Date date = df.parse(dateString);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
Calendar now = Calendar.getInstance();
if (cal.after(now)) {
cal.add(Calendar.YEAR, -100);
}
return cal;
}
Mit anderen Worten, lassen Simple den String parsen und nur das Jahr einstellen vorigen Jahrhundert sein, wenn Simple (
Wenn Joda Zeit ist eine Option: ich weiß Joda Zeit nicht Teil der Java SE ist, und wie ich in einem anderen Thread gesagt habe, ich duldet in der Regel nicht über eine Drittanbieter-Bibliothek verwenden, wenn es eine Java-Bibliothek ist, die das gleiche tut. die Person aber, die Joda Zeit entwickelt sich auch JSR310 führende -. Datum und Uhrzeit API, die es in Java 7. Also ich Joda Zeit machen werde grundsätzlich in Zukunft Java sein würde Mitteilungen String inputDate = "01/01/08";
// assuming U.S. style date, since it's not clear from your original question
DateTimeFormatter parser = DateTimeFormat.forPattern("MM/dd/yy");
DateTime dateTime = parser.parseDateTime(inputDate);
// if after current time
if (dateTime.isAfter(new DateTime())) {
dateTime = dateTime.minus(Years.ONE);
}
return dateTime.toString("MM/dd/yyyy");
Date deliverDate = new SimpleDateFormat("MM/dd/yy").parse(deliverDateString);
String dateString2 = new SimpleDateFormat("yyyy-MM-dd").format(deliverDate);
für mich arbeiten.
Pivot Jahr In Joda-Time
Die ausgezeichnete Joda-Time 2.5-Bibliothek enthält diese Funktionalität. Keine Notwendigkeit, beliebigen Code selbst zu schreiben. Rufen Sie einfach an withPivotYear()
auf DateTimeFormatter
. Sehen Sie das verknüpfte doc für Beispiele dafür, wie es zu benutzen.
Der beste Weg ist, um die Joda Zeit API für Daten und Zeiten in Java zu verwenden.