web-dev-qa-db-fra.com

GsonBuilder setDateFormat pour "2011-10-26T20: 29: 59-07: 00"

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?

49
LuxuryMode

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();
95
BalusC

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

  • X
    Zone offset
    Example:
        X       +09
        XX      +0930 
        XXX     +09:30
        XXX     -05:00
        XXXX    +093045
        XXXXX   +08:30:45
    
10
Loki

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>
5
Spark.Bao

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();
}
4
JoeLallouz