Używanie interfejsu Joda Date & Time API do analizy wielu formatów
Analizuję pliki dziennika stron trzecich zawierające datę/czas za pomocą Joda. Data/godzina jest w jednym z dwóch różnych formatów, w zależności od wieku plików dziennika, które analizuję.
Obecnie mam taki kod:
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);
}
To działa, ale przeczy Radom Joshuy Blocha z Effective Java 2nd Edition(pozycja 57: używaj WYJĄTKÓW tylko w wyjątkowych warunkach). Utrudnia to również ustalenie, czy Nielegalargumentexception występuje z powodu spieprzonej daty/czasu w dzienniku plik.
Możesz zasugerować ładniejsze podejście, które nie nadużywa WYJĄTKÓW?
3 answers
Możesz utworzyć wiele parserów i dodać je do konstruktora za pomocą DateTimeFormatterBuilder.metoda append :
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" );
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-22 13:05:42
Joda-Time wspiera to, pozwalając na podanie wielu parserów - DateTimeFormatterBuilder#append
Po prostu utwórz dwa formatery za pomocą konstruktora i wywołaj toParser()
Na każdym z nich. Następnie użyj konstruktora, aby połączyć je za pomocą append
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-23 08:52:10
Niestety nie wierzę, że czas Jody ma takie możliwości. Byłoby miło mieć metodę "tryParseDateTime", ale ona nie istnieje.
Sugeruję wyizolowanie tego zachowania na własną klasę (taką, która bierze listę wzorców i spróbuje każdego z kolei), tak aby brzydota była tylko w jednym miejscu. Jeśli powoduje to problemy z wydajnością, warto spróbować użyć heurystyki, aby odgadnąć, który format należy najpierw wypróbować. Na przykład, w Twoim przypadku, jeśli ciąg zaczyna się od / align = "left" /
Zauważ, że DateTimeFormatter
S w czasie Joda są konwencjonalnie niezmienne - nie powinieneś tworzyć nowego za każdym razem, gdy chcesz parsować linię. Stwórz je raz i wykorzystaj ponownie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-22 09:22:37