Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe ein Datum in Form von yyyy-MM-dd und möchte dies nun gerne in dd.MM.yyyy parsen, bekomme aber eine ParseException..
Hier der Code
Code:
public String modifyDate(String inputDate) throws ParseException {
String result;
DateFormat srcDf = new SimpleDateFormat("yyyy-MM-dd");
Date date = srcDf.parse(inputDate);
DateFormat destDf = new SimpleDateFormat("dd.MM.yyyy");
result = destDf.format(date);
return result;
}
Der Stacktrace lautet "unparseable date ...".
Die Variable Result habe ich mir angelegt, damit ich im Debuggen besser sehen kann was mit dem Datum passiert und habe den Übeltäter gefunden.
Mache ich aus "2000-10-10" -> "10.10.2000", dann wendet er das ganze nochmal an, wenn ich das neue Datum nochmal reinstecke.
Problem gelöst indem ich als erstes Frage, ob inputDate schon im Wunschformat ist.
@Jstein: er macht das selbe Objekt daraus, weil die JVM interpretiert. Richtig?
In der Tat, weil ich unterwegs war und zufällig nicht mein Projekt und Netbeans auf meinem Handy habe
Problem ist doch gelöst. Wieso rumstänkern? Beziehungsweise: Hauptsache rumstänkern.
Wenn "java.text.ParseException: Unparseable date: ....." da steht, ist das halt die Exception, was soll ich da noch weiter spezifizieren. Dass die Exception wohl in der von mir gegebenen Methode auftritt, ist ja wohl auch einleuchtend..
Ich finde nicht das das Problem gelöst ist, wenn du eine Methode, die ein Datum im Format yyyy-MM-dd erwartet mit einem Format von dd.MM.yyyy aufrufst und die Excpetion dann unterdrückst indem du vorher checkst wie das ankommende Format ist. Das ist fuscherei hoch 10.
Du nennst es Fuscherei, ich nenne es strikte Einhaltung gewisser Richtlinien. Wenn nur ein Format für ein Datum aktzeptiert wurde (früher) und diese nun auf ein neues Format gebracht werden soll, gibt es auch nur ein Fall. Hat jedoch ein Fuscher ein falsches Format für ein Datum (früher) verwendet, dann funktioniert es halt nicht. (wobei eine Exception wirklich unschön ist)
Also. Es ist ja nur ein kleines Projekt und es gibt nur ein Format. Wenn ein Datum im Format yyyy-MM-dd reinkommt ist alles fein.
Wenn ein Datum im Format dd.MM.yyyy reinkommt, wird eine Exception geworfen. Wieso? Das Datum ist doch korrekt und muss nicht geparst werden. Also Abfrage ob das Datum schon das korrekte Format hat.
Alle anderen Formate werden schlichtweg nicht akzeptiert.
Oder wie würdest du das nun machen, damit es nicht gefuscht ist? Ein Else-Zweig einbauen?
edit: Sorry, das könnte etwas pampig rübergekommen sein :/
Wenn das Datum schon das richtige Format besitzt sollte die MEthod gar nicht aufgerufen werden. Wenn sie doch aufgerufen wird, dann ist halt schon vorher was schief gelaufen.
Ausserdem ist ein Datum im Format dd.MM.yyyy nur für eine einzige Anwedung sinvoll. Nämlich wenn du das Datum ausgeben willst und das auch nicht in England oder USA.
Du kannst weder damit rechnen noch vergleichen.
Also sollte die Methode auch entsprechend genannt werden. Also zum Beispiel getDateOutputFormatString() oder sowas.
Weiterhin würde ich in dem Fall mit Locale arbeiten, denn dann hast du das Format für die Ausgabe auch gleich immer in dem Landesspezifischen Format.
Wenn das Datum schon das richtige Format besitzt sollte die MEthod gar nicht aufgerufen werden. Wenn sie doch aufgerufen wird, dann ist halt schon vorher was schief gelaufen.
Ja, ich könnte vorher schon prüfen, ob das Datum im richtigen Format ist.
Ich habe generell eine große Liste von Daten, die an Objekte gebunden sind und die Daten haben nur das yyyy-MM-dd Format. Deshalb rufe ich diese Methode im getter des Objekts "getDate" auf, damit ich direkt das richtige Datum zurückbekomme und nicht erst immer nachfragen muss, sondern egal wo ich mich im Code befinde, kann ich einfach getDate() aufrufen und bekomme ein korrektes Ergebnis ohne vorher das Format prüfen zu müssen.
Falls sich meine Ansprüche mal erweitern sollten, muss ich logischerweise auch die Methode u.ä. erweitern.
Falls es dann mal so weit ist, werde ich alles in mein eigenes util-package verstauen.
In Deinen Objekten solltest Du ein Datum immer als Datum , also Date, LocalDate, LocalDateTime speichern und verwenden. Da hat ein Datum als String nichts verloren. Erst wenn Du das Datum ausgeben willst formatierst du es in das benötigte Format.
Also wenn du vorher in deine Methode prüfst, ob es schon im richtigen Format ist (am besten mit Regex), dann gib einfach das zurück und hast das hin- und hergeparse nicht nötig:
Java:
private static final Pattern DATE_PATTERN = Pattern.compile("\\d{2}\\.\\d{2}\\.\\d{4}");
private static final DateFormat SRC_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
private static final DateFormat DST_DATE_FORMAT = new SimpleDateFormat("dd.MM.yyyy");
public String modifyDate(String inputDate) throws ParseException {
if (DATE_PATTERN.matcher(inputDate).matches()) {
return inputDate;
} else {
return DST_DATE_FORMAT.format(SRC_DATE_FORMAT.parse(inputDate));
}
}