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

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

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.

Ответы [ 3 ]

2 голосов
/ 27 марта 2012

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

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

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

2 голосов
/ 27 марта 2012

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

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

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

1 голос
/ 27 марта 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());
...