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