SimpleDateFormat разбор часовых поясов - PullRequest
2 голосов
/ 04 декабря 2011

Мне трудно разобрать эту дату, это +0 в конце, который вызывает проблему, кто-нибудь знает, что не так с моей строкой формата ??Если я удаляю +0 из строки даты и Z из строки формата, она работает нормально, к сожалению, для моего приложения это не вариант.

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        SimpleDateFormat dateFormater = new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss zZ");
        try {
            Date d = dateFormater.parse("Sun, 04 Dec 2011 18:40:22 GMT+0");
            System.out.println(d.toLocaleString());
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011

Один из подходов состоит в том, чтобы использовать обычные методы манипуляции со строками для перевода вашей строки из формы, которую вы ожидаете, в форму, которую SimpleDateFormat поймет.Вы не сказали точно, какой диапазон форматов часовых поясов является приемлемым, но одна возможность выглядит примерно так:

private static Date parse(String dateString) throws ParseException
{
    final SimpleDateFormat dateFormat =
        new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss Z");
    dateString = dateString.replaceAll("(GMT[+-])(\\d)$", "$1\\0$2");
    dateString = dateString.replaceAll("(GMT[+-]\\d\\d)$", "$1:00");
    return dateFormat.parse(dateString);
}

Это будет поддерживать GMT плюс-или-минус одно- или двухзначное числочасовое смещение, в дополнение к поддержке чего-либо, уже поддерживаемого SimpleDateFormat, такого как EST или GMT+1030.

В качестве альтернативы, если вы знаете, что это всегда будет GMT, тогда вы можете просто установить время-zone в форматере и игнорируйте часовой пояс в строке:

private static Date parse(String dateString) throws ParseException
{
    final SimpleDateFormat dateFormat =
        new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss");
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
    return dateFormat.parse(dateString);
}

Вы также можете разделить разницу.Я заметил, что формат часового пояса в вашей строке соответствует ожидаемому TimeZone.getTimeZone().Это намеренно?Если это так, вы можете извлечь этот формат часового пояса из строки, передать его заранее dateFormat.setTimeZone, а затем проигнорировать его во время фактического анализа:

private static Date parse(final String dateString) throws ParseException
{
    final SimpleDateFormat dateFormat =
        new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss");
    if(dateString.indexOf("GMT") > 0)
        dateFormat.setTimeZone
        (
            TimeZone.getTimeZone
                (dateString.substring(dateString.indexOf("GMT")))
        );
    return dateFormat.parse(dateString);
}
2 голосов
/ 04 декабря 2011

Если формат такой постоянный, вы можете добавить 0:00 к строке даты.

String dateString = "Sun, 04 Dec 2011 18:40:22 GMT+0";
SimpleDateFormat sdf = new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss z", Locale.ENGLISH);
Date date = sdf.parse(dateString + "0:00");
System.out.println(date);

(обратите внимание, что я исправил конструкцию SimpleDateFormat вявно укажите языковой стандарт, который будет использоваться для анализа имен дней недели и месяцев, в противном случае он может не работать на платформах, которые не используют английский язык в качестве языкового стандарта по умолчанию, также мне интересно, если вы не на самом деле нуждаются HH вместо kk, но это в сторону)

...