Я получаю дату/время в json как 2011-10-26T20:29:59-07:00
. Какой правильный способ использовать gsonBuilder.setDateFormat
для правильного форматирования на этот раз?
GsonBuilder setDateFormat для "2011-10-26T20: 29: 59-07: 00"
Ответ 1
-07:00
- это обозначение часового пояса ISO 8601. Это не поддерживается SimpleDateFormat
до Java 7. Итак, если вы можете обновить до Java 7, то вы можете использовать X
для представления этой записи часового пояса:
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssX").create();
В Java 6 вам нужно будет выполнить сопоставление и замену шаблонов в строке JSON, чтобы заменить часть -07:00
на RFC 822 -0700
, чтобы вы могли использовать Z
:
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();
или общей записью часового пояса GMT-07:00
, чтобы вы могли использовать Z
:
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();
Ответ 2
Для Java 8 (не проверены для Java 7) просто используйте шаблон
yyyy-MM-dd'T'HH:mm:ssXXX
Чтобы получить именно формат 2011-10-26T20:29:59-07:00
.
Шаблон часового пояса - Java Date Time - пользовательские шаблоны формата даты
- X
Zone offset Example: X +09 XX +0930 XXX +09:30 XXX -05:00 XXXX +093045 XXXXX +08:30:45
Ответ 3
Прошло некоторое время с тех пор, как это было опубликовано, но натолкнулось на это, пытаясь использовать GSON для анализа ответа API, который имел этот формат даты. Я решил, что поделился бы двумя небольшими функциями, которые я написал с помощью regex, чтобы найти все даты и изменить их в формате, который может обрабатывать GSON.
private static String cleanDateFormat(String json){ // takes in a string of JSON
Pattern regex = Pattern.compile("\\d\\d:\\d\\d:\\d\\d[-\\+]\\d\\d:\\d\\d");
Matcher regexMatcher = regex.matcher(json);
StringBuffer buff = new StringBuffer();
while(regexMatcher.find()){
regexMatcher.appendReplacement(buff, getSubOfMatch(regexMatcher));
}
regexMatcher.appendTail(buff);
return buff.toString();
}
//then pull out the colon.
private static String getSubOfMatch(Matcher matcher){
StringBuilder sb = new StringBuilder(matcher.group(0));
sb.deleteCharAt(sb.length()-3);
return sb.toString();
}
Ответ 4
Формат даты ответа api в точности совпадает с вашим:
"weather": {
"temperature": 31,
"time": "2016-06-23T09:28:38+08:00"
}
в Android-проекте, я использую следующий код, оба работают для меня.
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.create();
// or, also work
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
.create();
"yyyy-MM-dd'T'HH:mm:ssX"
не работает в Android, хотя я настроил использование Java 8 в build.gradle
.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
как нам узнать формат даты, который мы должны установить, на самом деле вы можете найти ответ из исходного кода SimpleDateFormat.java
:
* <p>Which produces this output when run in the America/Los_Angeles time zone:
* <pre>
* yyyy-MM-dd 1969-12-31
* yyyy-MM-dd 1970-01-01
* yyyy-MM-dd HH:mm 1969-12-31 16:00
* yyyy-MM-dd HH:mm 1970-01-01 00:00
* yyyy-MM-dd HH:mmZ 1969-12-31 16:00-0800
* yyyy-MM-dd HH:mmZ 1970-01-01 00:00+0000
* yyyy-MM-dd HH:mm:ss.SSSZ 1969-12-31 16:00:00.000-0800
* yyyy-MM-dd HH:mm:ss.SSSZ 1970-01-01 00:00:00.000+0000
* yyyy-MM-dd'T'HH:mm:ss.SSSZ 1969-12-31T16:00:00.000-0800
* yyyy-MM-dd'T'HH:mm:ss.SSSZ 1970-01-01T00:00:00.000+0000
* </pre>