Использование 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);
}
Это работает, но противоречит совету Джошуа Блоха из Effective Java 2nd Edition (пункт 57: Используйте исключения только для исключительных условий). Это также затрудняет определение того, возникает ли IllegalArgumentException из-за испорченной даты / времени в файле журнала.
Можете ли вы предложить более хороший подход, в котором не используются исключения?
3 ответа
Вы можете создать несколько анализаторов и добавить их в конструктор, используя метод DateTimeFormatterBuilder.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" );
Joda-Time поддерживает это, позволяя указывать несколько парсеров - DateTimeFormatterBuilder # append
Просто создайте свои два форматера, используя строитель и вызовите toParser()
на каждой. Затем используйте строитель, чтобы объединить их, используя append
,
К сожалению, я не верю, что у Joda Time есть такие возможности. Было бы неплохо иметь метод tryParseDateTime, но его не существует.
Я предлагаю вам изолировать это поведение в своем собственном классе (который берет список шаблонов и будет проверять каждый по очереди), чтобы уродство было только в одном месте. Если это вызывает проблемы с производительностью, вы можете попробовать использовать некоторые эвристические методы, чтобы угадать, какой формат попробовать в первую очередь. Например, в вашем случае, если строка начинается с цифры, это, вероятно, первый шаблон.
Обратите внимание, что DateTimeFormatter
s в Joda Time условно неизменны - вы не должны создавать новый каждый раз, когда хотите разобрать строку. Создайте их один раз и используйте их повторно.