Используя 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);
}

Это работает, но нарушает совет Joshua Bloch от Эффективного Java 2-й Выпуск (Объект 57: Используйте исключения только для исключительных условий). Это также мешает определять, происходит ли IllegalArgumentException из-за завинченного дата/время в файле журнала.

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

74
задан JodaStephen 15 June 2011 в 07:15
поделиться

2 ответа

Joda-Time поддерживает это, позволяя указывать несколько синтаксических анализаторов - DateTimeFormatterBuilder # append

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

17
ответ дан 24 November 2019 в 11:55
поделиться

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

Я предлагаю вам выделить это поведение в свой собственный класс (тот, который берет список шаблонов и будет пробовать каждый по очереди), чтобы уродство было только в одном месте. Если это вызывает проблемы с производительностью, вы можете попробовать использовать некоторые эвристики, чтобы угадать, какой формат попробовать в первую очередь. Например, в вашем случае, если строка начинается с цифры, то это, вероятно, первый шаблон.

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

7
ответ дан 24 November 2019 в 11:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: