Дата 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;
}
}
Тьфу!
Ответы
Ответ 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
в часовом поясе...