GsonBuilder setDateFormat para “2011-10-26T20: 29: 59-07: 00”

Recibo una fecha / hora en json como 2011-10-26T20:29:59-07:00 . ¿Cuál es la forma correcta de usar gsonBuilder.setDateFormat para formatear correctamente esta vez?

El -07:00 es la notación de zona horaria ISO 8601. SimpleDateFormat no admite SimpleDateFormat hasta Java 7 . Entonces, si puedes actualizar a Java 7, entonces puedes usar la X para representar esa notación de zona horaria:

 Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssX").create(); 

En Java 6 , tendría que hacer un poco de comparación de patrones y reemplazo en la cadena JSON para reemplazar la parte -07:00 por la notación RFC 822 -0700 para que pueda usar Z :

 Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create(); 

o por la notación de zona horaria general GMT-07:00 para que pueda usar z :

 Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssz").create(); 

Para Java 8 (no se ha verificado para Java 7), solo use el patrón

 yyyy-MM-dd'T'HH:mm:ssXXX 

Para obtener exactamente el formato de 2011-10-26T20:29:59-07:00 .

El patrón de zona horaria es de Java Date Time – Custom Date Format Patterns

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

El formato de mi fecha de respuesta api es exactamente igual al tuyo, así:

 "weather": { "temperature": 31, "time": "2016-06-23T09:28:38+08:00" } 

En el proyecto de Android, uso el siguiente código, ambos funcionan para mí.

 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" no funciona en Android, aunque he configurado Java 8 en build.gradle .

 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } 

¿Cómo sabemos el formato de fecha que debemos establecer? De hecho, puede encontrar la respuesta en el código fuente de SimpleDateFormat.java :

  * 

Which produces this output when run in the America/Los_Angeles time zone: *

 * 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 * 

Ha pasado un tiempo desde que se publicó, pero se cruzó cuando intenté usar GSON para analizar una respuesta API que tenía este formato de fecha. Pensé que compartiría las 2 pequeñas funciones que escribí usando regex para encontrar todas las fechas y cambiarlas al formato que GSON puede analizar.

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