Ich analysiere Protokolldateien von Drittanbietern, die Datum und Uhrzeit enthalten, mit Joda. Das Datum und die Uhrzeit liegen in einem von zwei verschiedenen Formaten vor, abhängig vom Alter der Protokolldateien, die ich analysiere.
Derzeit habe ich folgenden Code:
try {
return DateTimeFormat.forPattern("yyyy/MM/dd HH:mm:ss").parseDateTime(datePart);
} catch (IllegalArgumentException e) {
return DateTimeFormat.forPattern("E, MMM dd, yyyy HH:mm").parseDateTime(datePart);
}
Dies funktioniert, widerspricht jedoch Joshua Blochs Rat aus Effective Java 2nd Edition (Punkt 57: Verwenden Sie Ausnahmen nur für außergewöhnliche Bedingungen). Es ist auch schwierig festzustellen, ob eine IllegalArgumentException aufgrund eines fehlerhaften Datums / einer fehlerhaften Uhrzeit in einer Protokolldatei auftritt.
Können Sie einen schöneren Ansatz vorschlagen, der Ausnahmen nicht missbraucht?
Antworten:
Sie können mehrere Parser erstellen und diese mithilfe der DateTimeFormatterBuilder.append- Methode zum Builder hinzufügen :
DateTimeParser[] parsers = { DateTimeFormat.forPattern( "yyyy-MM-dd HH" ).getParser(), DateTimeFormat.forPattern( "yyyy-MM-dd" ).getParser() }; DateTimeFormatter formatter = new DateTimeFormatterBuilder().append( null, parsers ).toFormatter(); DateTime date1 = formatter.parseDateTime( "2010-01-01" ); DateTime date2 = formatter.parseDateTime( "2010-01-01 01" );
quelle
append
Überladungen die einzige, die bei widersprüchlichen Formaten keine Ausnahme auslöst.Joda-Time unterstützt dies, indem mehrere Parser angegeben werden können - DateTimeFormatterBuilder # append
Erstellen Sie einfach Ihre beiden Formatierer mit einem Builder und rufen Sie
toParser()
jeden auf. Verwenden Sie dann den Builder, um sie mit zu kombinierenappend
.quelle
Leider glaube ich nicht, dass Joda Time über solche Fähigkeiten verfügt. Es wäre schön, eine "tryParseDateTime" -Methode zu haben, aber sie existiert nicht.
Ich schlage vor, Sie isolieren dieses Verhalten in Ihre eigene Klasse (eine, die eine Liste von Mustern erstellt und diese nacheinander ausprobiert), damit die Hässlichkeit nur an einer Stelle ist. Wenn dies zu Leistungsproblemen führt, sollten Sie versuchen, mithilfe einiger Heuristiken zu erraten, welches Format zuerst versucht werden soll. Wenn in Ihrem Fall die Zeichenfolge beispielsweise mit einer Ziffer beginnt, ist dies wahrscheinlich das erste Muster.
Beachten Sie, dass
DateTimeFormatter
s in Joda Time herkömmlicherweise unveränderlich sind - Sie sollten nicht jedes Mal eine neue erstellen, wenn Sie eine Zeile analysieren möchten. Erstellen Sie sie einmal und verwenden Sie sie wieder.quelle