Je reçois une date/heure en json en tant que 2011-10-26T20:29:59-07:00
. Quelle est la bonne façon d'utiliser gsonBuilder.setDateFormat
pour formater correctement cette fois?
Le -07:00
est la notation de fuseau horaire ISO 8601. Ceci n'est pas pris en charge par SimpleDateFormat
tant que Java 7 . Donc, si vous pouvez pgrade to Java 7, alors vous pouvez utiliser le X
pour représenter cette notation de fuseau horaire:
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssX").create();
Sur Java 6 vous auriez besoin de faire une correspondance de modèle et de remplacer d'abord la chaîne JSON pour remplacer le -07:00
partie par la notation RFC 822 -0700
pour pouvoir utiliser Z
:
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();
ou par la notation générale de fuseau horaire GMT-07:00
pour pouvoir utiliser z
:
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssz").create();
Pour Java 8 (n'ont pas vérifié pour Java 7), utilisez simplement le modèle
yyyy-MM-dd'T'HH:mm:ssXXX
Pour obtenir exactement le format de 2011-10-26T20:29:59-07:00
.
Le modèle de fuseau horaire est de Java Date Time - Patterns de format de date personnalisés
Zone offset Example: X +09 XX +0930 XXX +09:30 XXX -05:00 XXXX +093045 XXXXX +08:30:45
Mon format de date de réponse api est exactement le même que le vôtre, comme ceci:
"weather": {
"temperature": 31,
"time": "2016-06-23T09:28:38+08:00"
}
dans Android, j'utilise le code suivant, les deux fonctionnent pour moi.
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"
ne fonctionne pas sous Android, même si j'ai configuré l'utilisation Java 8 dans build.gradle
.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
comment savons-nous le format de date que nous devons définir, en fait, vous pouvez trouver la réponse à partir du code source de 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>
Cela fait un moment que cela n'a pas été publié, mais il l'a traversé en essayant d'utiliser GSON pour analyser une réponse API ayant ce format de date. Je me suis dit que je partagerais les 2 petites fonctions que j'ai écrites en utilisant regex pour trouver toutes les dates et les changer au format que GSON peut ensuite analyser.
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();
}