Использование 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 ответа:
вы можете создать несколько парсеров и добавить их в конструктор с помощью 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", но его не существует.
отметим, что
DateTimeFormatter
s в Joda Time условно неизменны - вы не должны создавать новый каждый раз, когда вы хотите разобрать строку. Создать их один раз и повторно использовать их.