Подтвердить что ты не робот

Дата JSON для даты Java?

Я ничего не мог найти. Я получаю JSON из API, который возвращает стандартные даты JSON. Формат можно просмотреть, запустив этот код в консоли JavaScript:

> new Date().toJSON();
"2010-10-27T11:58:22.973Z"

Ну, на самом деле API, с которым я работаю, не возвращает миллисекундную часть, а иногда возвращает часовой пояс вместо Z, поэтому даты могут выглядеть как любой из них:

  • 2010-10-27T11:58:22Z
  • 2010-10-27T11:58:22+03:00

Анализ таких дат несколько громоздкий. Есть ли способ разобрать эти даты, используя org.json?

Мое текущее решение:

public static Date parseDateTime(String dateString) {
    if (dateString == null) return null;
    DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
    if (dateString.contains("T")) dateString = dateString.replace('T', ' ');
    if (dateString.contains("Z")) dateString = dateString.replace("Z", "+0000");
    else
        dateString = dateString.substring(0, dateString.lastIndexOf(':')) + dateString.substring(dateString.lastIndexOf(':')+1);
    try {
        return fmt.parse(dateString);
    }
    catch (ParseException e) {
        Log.e(Const.TAG, "Could not parse datetime: " + dateString);
        return null;
    }
}

Тьфу!

4b9b3361

Ответ 1

Этот формат DateTime на самом деле является ISO 8601 DateTime. JSON не указывает какой-либо конкретный формат для дат/времени. Если вы Google немного, вы найдете множество реализаций для его анализа на Java.

Здесь один

Если вы открыты для использования чего-то другого, кроме встроенных классов Java Date/Time/Calendar, я также предлагаю Joda Time. Они предлагают (во многом) ISODateTimeFormat для синтаксического анализа этих типов строк.

Ответ 2

Обратите внимание, что шаблон формата SimpleDateFormat Z для часового пояса RFC 822 и шаблон X для ISO 8601 (этот стандарт поддерживает однобуквенные названия часовых поясов, такие как Z для Zulu).

So new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX") создает формат, который может анализировать как "2013-03-11T01:38:18.309Z", так и "2013-03-11T01:38:18.309+0000" и даст вам тот же результат.

К сожалению, насколько я могу судить, вы не можете получить этот формат для генерации Z для версии Zulu, что раздражает.

У меня на самом деле больше проблем со стороны JavaScript для работы с обоими форматами.

Ответ 3

Если вам нужно поддерживать несколько форматов, вам нужно будет соответствующим образом сопоставить ваш вход и синтаксис.

final DateFormat fmt;
if (dateString.endsWith("Z")) {
    fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
} else {
    fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
}

Я бы предположил, что вы имеете дело с ошибкой в ​​используемом вами API, который где-то цитировал шаблон даты Z в часовом поясе...