Java - не разбираемая дата, формат должен соответствовать «GMT-0400» - PullRequest
2 голосов
/ 29 февраля 2012

У меня есть следующий Java:

DateFormat formatter = new SimpleDateFormat(
    "EEE MMM dd yyyy HH:mm:ss zZ (zzzz)", Locale.ENGLISH);
Calendar cal = Calendar.getInstance();
cal.set(2011, Calendar.APRIL, 1);
out.println(formatter.format(cal.getTime()));
out.println();

Date date;
try {
    date = formatter
        .parse("Fri Apr 01 2011 00:00:00 GMT-0400 (Eastern Daylight Time)");
} catch (ParseException e) {
    out.println("Failed to parse date: " + e.getMessage());
    e.printStackTrace(out);
}

Это в сервлете, и дата, построенная Calendar, выглядит так:

Пт. 01 апреля 2011 16: 42: 24 EDT-0400 (восточное дневное время)

Это похоже на тот же формат, что и строка даты, которую я пытаюсь проанализировать, за исключением EDT-0400 и требуемого GMT-0400.При попытке разобрать строку даты происходит сбой кода:

java.text.ParseException: Неразборчивая дата: «Пт 01 апреля 2011 00:00:00 GMT-0400 (восточное дневное время)»

Как я могу разобрать такую ​​строку?Это происходит из даты JavaScript в модели Sencha Touch 1.1.1, хранящейся в локальном хранилище WebSQL.

Ответы [ 2 ]

3 голосов
/ 29 февраля 2012

По какой-то причине GMT-0400 не работает, а UTC-0400 работает.Вы можете заменить GMT на UTC.

Обратите внимание, что эта часть будет полностью проигнорирована - часовой пояс будет определяться исходя из того, что указано в скобках (по крайней мере, на моей машине, JDK 6)

2 голосов
/ 29 февраля 2012

Я отладил SimpleDateFormat, и кажется, что он будет только анализировать GMT-04:00, но не GMT-0400.

Он примет UTC-0400, однако он выбросит модификатор часов / минут и будетнеправильно проанализировать его как UTC.(Это происходит с любым другим обозначением часового пояса, кроме GMT)

Он также будет правильно анализировать -0400, поэтому наиболее надежным решением, вероятно, является просто удаление GMT из строки даты.

Результатом этой истории является то, что SimpleDateFormat совсем не прост.

Обновление: еще один урок заключается в том, что я мог бы сэкономить много времени, передав объект ParsePosition parse() method:

    DateFormat formatter = new SimpleDateFormat(
        "EEE MMM dd yyyy HH:mm:ss zzzz", Locale.ENGLISH);
    Date date;
    ParsePosition pos = new ParsePosition( 0 );
    date = formatter
        .parse("Fri Apr 01 2011 00:00:00 UTC-0400", pos);
    System.out.println( pos.getIndex() );

Распечатает 28, указывая, что синтаксический анализ завершился с индексом символа 28, сразу после UTC.

...