Разбор RFC 2822 даты в JAVA - PullRequest
15 голосов
/ 17 марта 2010

Мне нужно проанализировать строковое представление RFC 2822 даты в Java. Пример строки здесь:

Сб, 13 марта 2010 11:29:05 -0800

Это выглядит довольно неприятно, поэтому я хотел убедиться, что я все делал правильно и позже у меня возникнут странные проблемы с неправильной интерпретацией даты из-за проблем с AM-PM / военного времени, проблем с временем UTC, проблем, которых я не имею предвидеть и т.д ...

Спасибо!

Ответы [ 4 ]

21 голосов
/ 17 марта 2010

Это быстрый код, который делает то, что вы просите (используя SimpleDateFormat )

String rfcDate = "Sat, 13 Mar 2010 11:29:05 -0800";
String pattern = "EEE, dd MMM yyyy HH:mm:ss Z";
SimpleDateFormat format = new SimpleDateFormat(pattern);
Date javaDate = format.parse(rfcDate);

//Done.

PS. Я не имел дело с исключениями и параллелизмом здесь (так как SimpleDateFormat не синхронизируется при разборе даты).

20 голосов
/ 06 апреля 2011

Если ваше приложение использует язык, отличный от английского, вы можете задать языковой стандарт для анализа / форматирования даты с помощью альтернативного конструктора SimpleDateFormat:

String pattern = "EEE, dd MMM yyyy HH:mm:ss Z";
SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.ENGLISH);
6 голосов
/ 01 июля 2013

Имейте в виду, что [день недели ","] является необязательным в RFC-2822, поэтому предлагаемые примеры не охватывают все форматы даты RFC-2822. Кроме того, тип даты RFC-822 допускает много разных обозначений часовых поясов (obs-zone), которые не охватываются спецификатором формата "Z".

Я думаю, что нет простого выхода, кроме поиска "," и "- | +", чтобы определить, какой шаблон использовать.

1 голос
/ 13 декабря 2018

Начиная с Java 8 были реализованы новые классы даты и времени: java.time.ZonedDateTime и java.time.LocalDateTime. ZonedDateTime поддерживает разбор строк RFC практически из коробки:

String rfcDate = "Tue, 4 Dec 2018 17:37:31 +0100 (CET)";  
if (rfcDate.matches(".*[ ]\\(\\w\\w\\w\\)$")) {
    //Brackets with time zone are added sometimes, for example by JavaMail
    //This must be removed before parsing
    //from: "Tue, 4 Dec 2018 17:37:31 +0100 (CET)"
    //  to: "Tue, 4 Dec 2018 17:37:31 +0100"
    rfcDate = rfcDate.substring(0, rfcDate.length() - 6);
}

//and now parsing... 
DateTimeFormatter dateFormat = DateTimeFormatter.RFC_1123_DATE_TIME;
try {
    ZonedDateTime zoned = ZonedDateTime.parse(rfcDate, dateFormat);
    LocalDateTime local = zoned.toLocalDateTime();        
} catch (DateTimeParseException e) { ... }
...