2010-07-22 14 views
67

Ich analysiere Protokolldateien von Drittanbietern, die Datum/Uhrzeit mit Joda enthalten. Das Datum/die Uhrzeit ist abhängig von dem Alter der Protokolldateien, die ich analysiere, in einem von zwei verschiedenen Formaten.Verwenden von Joda Date & Time API zum Analysieren mehrerer Formate

Zur Zeit habe ich Code wie folgt:

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); 
} 

Das funktioniert aber im Widerspruch zu Joshua Bloch-Tipps von Effective Java 2nd Edition (Artikel 57: Verwenden Sie Ausnahmen nur für Ausnahmebedingungen). Es macht es auch schwierig zu bestimmen, ob eine IllegalArgumentException aufgrund eines vermischten Datums in einer Protokolldatei auftritt.

Können Sie einen besseren Ansatz vorschlagen, der Ausnahmen nicht missbraucht?

+0

Vielleicht durch das Muster zu erraten, bevor es zu benutzen. –

Antwort

126

können Sie mehrere Parser erstellen und sie den Builder hinzufügen, indem Sie mit DateTimeFormatterBuilder.append Methode:

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"); 
+1

Dies funktioniert perfekt. Ich nehme an, Joda Stephen meinte das so, aber als ich versuchte, die Dinge nach seinen Anweisungen zu machen, scheiterte das Parsing. –

+1

Dies funktioniert nicht für zum Beispiel "5-5-5" und "5-5-2005", wenn Sie sowohl TT-MM-JJ als auch TT-MM-JJJJ wollen (Exception konnte nicht analysiert werden). Später fand ich heraus, dass dd-MM-yy auch dd-MM-yyyy gut analysiert, so dass mein Problem gelöst wurde. – Steven

+0

Seltsamerweise ist dies, trotz der Vielfalt von "append" Überladungen, die einzige, die keine Ausnahme auslöst, wenn widersprüchliche Formate gegeben werden. – shmosel

6

Leider glaube ich nicht, dass Joda Time solche Fähigkeiten hat. 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 nimmt, und wird jedes der Reihe nach versuchen), so dass die Hässlichkeit nur an einem Ort ist. Wenn dies zu Leistungsproblemen führt, sollten Sie versuchen, einige Heuristiken zu verwenden, um zu erraten, welches Format zuerst getestet werden soll. Zum Beispiel in Ihrem Fall, wenn die Zeichenfolge mit einer Ziffer beginnt, dann ist es wahrscheinlich das erste Muster.

Beachten Sie, dass DateTimeFormatter s in Joda Time konventionell unveränderbar sind - Sie sollten nicht jedes Mal ein neues erstellen, wenn Sie eine Zeile analysieren möchten. Erstellen Sie sie einmal und verwenden Sie sie erneut.

+0

Diese Antwort gibt meinem Kommentar einen Sinn. Ich bin ziemlich zufrieden :) Ich bin noch ein Anfänger, also würde ich es nicht als Antwort geben –

+0

Danke Jon. Ich wusste, dass DateTimeFormatters unveränderlich ist, aber aus Gründen der Kürze in meinem Codebeispiel wurden sie explizit erstellt. Es gibt keine unerträglichen Leistungsprobleme, also denke ich, dass ich tun werde, was Sie vorschlagen und eine Klasse schaffen, um die Hässlichkeit zu verbergen. –

16

Joda-Time unterstützt dies, indem mehrere Parser angegeben werden - DateTimeFormatterBuilder#append

einfach Ihre zwei Formatierer erstellen Builder verwenden und toParser() auf jeden Anruf. Dann verwenden Sie den Builder, um sie unter Verwendung append zu kombinieren.

+4

Whoa! Beantwortete direkt von dem Mann selbst! Liebe deine Arbeit Stephen. –

+2

Hmm, ich habe das versucht, aber Joda-Time scheint dann zu erwarten, dass die analysierte Zeichenkette mit einem Muster übereinstimmt, das aus BEIDEN zusammenhängenden Mustern besteht und nicht aus einem ODER dem anderen. –

+0

Vielleicht ist das Forum ein besserer Ort, um zu sehen, ob das ein Fehler ist - http://sourceforge.net/projects/joda-time/forums/forum/337835 – JodaStephen

Verwandte Themen