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?

Author: JodaStephen, 2010-07-22

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" );
 133
Author: btiernay,
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.

 16
Author: JodaStephen,
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.

 7
Author: Jon Skeet,
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