Использование Joda Date & Time API для анализа нескольких форматов - PullRequest
73 голосов
/ 22 июля 2010

Я анализирую сторонние файлы журналов, содержащие дату / время, используя 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 ]

140 голосов
/ 02 декабря 2010

Вы можете создать несколько анализаторов и добавить их в конструктор, используя 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" );
17 голосов
/ 23 июля 2010

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

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

7 голосов
/ 22 июля 2010

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

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

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

...