RFC822 Разбор часовых поясов в Java - PullRequest
8 голосов
/ 13 мая 2010

У меня есть дата JS, которая конвертируется Dojo в формат RFC822. Вызов функции - dojo.date.toRfc3339 (jsDate), генерирует следующую дату - 2007-02-26T20: 15: 00 + 02: 00.

У меня есть приложение, использующее дату Java SimpleDateFormat для анализа дат, сгенерированных выше. У меня проблемы с анализом этого формата даты из-за часового пояса. Я пытался использовать

гггг-мм-DD'T'hh: мм: сульфасалазин

Это не так, поскольку 'Z' для часового пояса не ожидает символа ':'. Кто-нибудь знает, как я мог бы указать шаблон для обработки даты RFC822 с ':'?

редакция:

Спасибо за правильную интерпретацию того, что я пытаюсь сделать :) Я хотел сказать, что дата генерируется в RFC3339, и мне нужен RFC822. Похоже, мне придется переопределить JavaScript. Я надеялся, что мне не нужно будет этого делать, и я мог бы указать шаблон формата даты без необходимости изменения какого-либо Java-кода, поскольку формат даты просто внедряется в компонент Spring приложения.

Просто для полноты, есть ли способ указать в выражении формата даты игнорирование символов в последовательности (без выполнения манипуляции / замены строки)? В этом случае я бы сказал, игнорировать любые ':' или просто игнорировать часовой пояс все вместе?

Ответы [ 7 ]

4 голосов
/ 23 января 2012
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {

    public static Date ParseRFC3339DateFormat(String p_date)
    {
        try{
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
            String dts = p_date.replaceAll("([\\+\\-]\\d\\d):(\\d\\d)","$1$2");
            return formatter.parse(dts);
        }catch (Exception e) {
                return null;
        }
    }
}
3 голосов
/ 13 мая 2010

Это работает

SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-DD'T'hh:mm:ssZ");
format.parse("2007-02-26T20:15:00+02:00".replaceAll("([\\+\\-]\\d\\d):(\\d\\d)","$1$2"));

(Обратите внимание, что я выбрал последнее двоеточие из формата после спецификатора формата 'Z'.)

2 голосов
/ 13 мая 2010

RFC822 не позволяет двоеточию находиться в части часового пояса даты. Ожидается только 4 цифры. Название этого метода Dojo указывает, что он использует RFC3339. Похоже, что это практически тот же формат, что и ISO8601 . Просто так получилось, что Joda Time имеет ISODateTimeFormat, что совместимо с ISO8601, если вы можете использовать эту библиотеку. Метод dateTimeNoMillis() выглядит как совпадение с форматом Dojo. Это действительно лучше, чем стандартный API даты и времени Java. В противном случае, предложение с высоким содержанием кофеина будет правильным.

Обновлено в ответ на обновление Jamen

Нет ли способа, чтобы Dojo использовал формат, не включающий часовой пояс? Затем вы можете настроить формат на стороне Java, чтобы соответствовать. Я не знаю много о Dojo, и я не смог найти никакой документации по функции toRfc3339, которую он предоставляет.

1 голос
/ 03 марта 2019

В Java 8 вы можете использовать:

Instant.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse( rfc822Time ) );

К вашему сведению: https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#RFC_1123_DATE_TIME

1 голос
/ 15 ноября 2013

Вы можете сделать это в общем случае без Java 7. Я задал 2 вопроса в StackOverflow по этому вопросу в течение 2012 года, поэтому существует решение, которое не требует каких-либо сторонних библиотек .

Просто проверьте реализацию, представленную в описании моего последнего вопроса , который также указывает на более ранний вопрос, в котором обсуждается именно эта проблема.

1 голос
/ 19 июня 2013

Вместо использования dojo.date.toRfc3339 (jsDate) вы можете создать свою собственную функцию со строкой пользовательского формата.

Что-то вроде следующего удалит двоеточие и должно быть доступно для вашего формата Java.

function toRfc3339String(jsDate){
    return dojo.date.locale.format(jsDate,{selector: 'date', datePattern:'yyyy-MM-dd\'T\'hh:mm:ssZ'});
}
1 голос
/ 13 мая 2010

Я бы убрал символ ':' из часового пояса и использовал бы формат, который вы указали выше.

...