Использование Joda Date & Time API для анализа нескольких форматов


я разбираю сторонние файлы журнала, содержащие дату / время, используя Joda. Дата / время находится в одном из двух разных форматов, в зависимости от возраста файлов журнала, которые я анализирую.

В настоящее время у меня есть такой код:

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

это работает, но противоречит совету Джошуа Блоха из эффективного Java 2nd Edition (пункт 57: используйте исключения только для исключительных условий). Это также затрудняет определение, происходит ли IllegalArgumentException из-за облажавшегося дата / время в файле журнала.

можете ли вы предложить более приятный подход, который не злоупотребляет исключениями?

3 68

3 ответа:

вы можете создать несколько парсеров и добавить их в конструктор с помощью DateTimeFormatterBuilder.добавить способ:

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

Joda времени поддерживает такую возможность, позволяя несколько анализаторов должны быть указаны - DateTimeFormatterBuilder#append

просто создайте свои два форматера с помощью конструктора и позвоните toParser() на каждого. Затем используйте конструктор, чтобы объединить их с помощью append.

к сожалению, я не верю, что у Joda Time есть такие возможности. Было бы неплохо иметь метод "tryParseDateTime", но его не существует.

отметим, что DateTimeFormatters в Joda Time условно неизменны - вы не должны создавать новый каждый раз, когда вы хотите разобрать строку. Создать их один раз и повторно использовать их.