Могу ли я использовать один шаблон SimpleDateFormat для дат с суффиксами «Z» и «+1:00»?

Я вызываю службу, которая возвращает даты по Гринвичу. Он работал нормально с ноября, но теперь, когда активен переход на летнее время, он не работает. Вот пример даты без перехода на летнее время:

2011-12-07T15:50:01Z

И один из сегодняшних (в летнее время):

2012-03-26T11:05:01+01:00

Раньше я использовал этот шаблон:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.UK);

Но его ошибка на второй дате выше с ParseExcepton («Неразборчивая дата...»). Итак, можно ли использовать один шаблон для обоих, и если да, то какой? Если я не могу использовать один шаблон для обоих, каков правильный шаблон для второй даты выше?

Это не должно иметь значения, но если это так, это используется на платформе Android.


person Chris Knight    schedule 26.03.2012    source источник


Ответы (3)


Определенно имеет значение, что вы используете Android, так как в этом случае это имело бы значение, если бы вы использовали Java 5/6 или 7.

Шаблон, который вы используете, определяет литерал «Z» (также «T») для анализа. Это не анализ часового пояса. Вам нужно отбросить одинарные кавычки вокруг «Z», чтобы начать синтаксический анализ фактического часового пояса.

Согласно Android JavaDoc, неясно, будет ли заглавная Z даже работать в этом случае, так как формат часов/минут довольно специфичен. Я недостаточно знаю об Android SDK, чтобы подтвердить, но двоеточие определенно имеет значение в стандартной Java.

person Spencer Kormos    schedule 26.03.2012
comment
Спасибо, Спенсер, я должен был знать, что это не будет прямым ответом! Я попытался отбросить одинарные кавычки вокруг «Z», и теперь он работает на второй дате (после удаления «:»), но не на первой. Похоже, мне нужно условно выбрать формат даты для анализа. - person Chris Knight; 27.03.2012
comment
Нет, просто замените Z в конце (если он существует) на +01:00 перед разбором даты. Z — это символ этого смещения. - person caw; 07.10.2012

Новый шаблон часового пояса ISO8601 охватывается спецификатором шаблона X, который представлен в Ява 7.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.UK);

Если вы все еще используете Java 6 или старше, тогда да, это может иметь значение. Вам нужно будет либо разобрать его (частично) самостоятельно, либо получить Joda Time.

person BalusC    schedule 26.03.2012

Если вы используете java6, вам нужно будет определить шаблоны, а затем применить средство форматирования.

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
    String date2Str="2011-12-07T15:50:01Z";
    Date date2 = df.parse(date2Str);
    System.out.println(date2.toString());

    SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
    String date1Str="2012-03-26T11:05:01GMT+01:00";
    Date date1 = df2.parse(date1Str);

    System.out.println(date1.toString());
person Oscar Castiblanco    schedule 26.03.2012