2011-06-13 33 views
8

Recibo muchas fechas de una fuente JSON.Formato de fecha JSON de Parse usando GSON en Android

se ven así: \/Date(1307972400000+0200)\/

tengo que analizar estas fechas en horas y minutos usando Java.

EDIT:

Esto es lo lejos que he llegado:

String s = dateString.replaceAll("^/Date\\(" , ""); 

Esto me da el siguiente resultado: 1307972400000+0200)/

¿Cómo puedo quitar el resto de esta cadena, ¿alguna sugerencia?

yo quiero que de esta manera: 1307972400000L

Respuesta

-1

¿Cómo puedo quitar el resto de esta cadena, alguna sugerencia?

yo quiero que de esta manera: 1307972400000L

Estrictamente hablando, sólo podía obtener la subcadena desde el principio hasta el carácter '+'.

String input = "/Date(1307972400000+0200)/"; 
String result = input.replaceAll("^/Date\\(" , ""); 
result = result.substring(0, result.indexOf('+')); 
System.out.println(new Long(result)); 
16

Es feed JSON del servicio .Net. Estoy usando este código:

public class GsonHelper { 
    public static Gson createWcfGson() { 
     GsonBuilder gsonb = new GsonBuilder(); 
     gsonb.registerTypeAdapter(Date.class, new WcfDateDeserializer()); 
     Gson gson = gsonb.create(); 
     return gson; 
    } 

    private static class WcfDateDeserializer implements JsonDeserializer<Date>, JsonSerializer<Date> { 

     public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
      String JSONDateToMilliseconds = "\\/(Date\\((.*?)(\\+.*)?\\))\\/"; 
      Pattern pattern = Pattern.compile(JSONDateToMilliseconds); 
      Matcher matcher = pattern.matcher(json.getAsJsonPrimitive().getAsString()); 
      String result = matcher.replaceAll("$2"); 
      return new Date(new Long(result)); 
    } 

     @Override 
     public JsonElement serialize(Date date, Type arg1, JsonSerializationContext arg2) { 
      return new JsonPrimitive("/Date(" + date.getTime() + ")/"); 
     } 
    } 
} 

Se registra serializador personalizado y deserializer para Date tipo. El uso es simple: Gson gson = GsonHelper.createWcfGson(); y haz lo que quieras.

Upd: Lo sentimos, el ejemplo anterior no funciona con zonas horarias. Es más fácil usar Calendar para tener en cuenta el desplazamiento de la zona horaria. Código se verá así:

public class GsonHelper { 
    public static Gson createWcfGson() { 
     GsonBuilder gsonb = new GsonBuilder(); 
     gsonb.registerTypeAdapter(Date.class, new WcfCalendarDeserializer()); 
     Gson gson = gsonb.create(); 
     return gson; 
    } 

    public static class WcfCalendarDeserializer implements JsonDeserializer<Calendar>, JsonSerializer<Calendar> { 

     public Calendar deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 

      String JSONDateToMilliseconds = "\\/(Date\\((.*?)(\\+.*)?\\))\\/"; 
      Pattern pattern = Pattern.compile(JSONDateToMilliseconds); 
      Matcher matcher = pattern.matcher(json.getAsJsonPrimitive().getAsString()); 
      matcher.matches(); 
      String tzone = matcher.group(3); 
      String result = matcher.replaceAll("$2"); 

      Calendar calendar = new GregorianCalendar(); 
      calendar.setTimeZone(TimeZone.getTimeZone("GMT" + tzone)); 
      calendar.setTimeInMillis(new Long(result)); 

      return calendar; 
     } 

     @Override 
     public JsonElement serialize(Calendar calendar, Type arg1, JsonSerializationContext arg2) { 
      return new JsonPrimitive("/Date(" + calendar.getTimeInMillis() + ")/"); 
     } 
    } 
} 

continuación, puede utilizar regresado Calendar objeto de conseguir horas y minutos (zona horaria y ajustar si es necesario).

calendar.get(Calendar.HOUR_OF_DAY); 
calendar.get(Calendar.MINUTE); 
+0

él debe ajustar la zona horaria (0200) – Selvin

+0

No sé si sólo soy estúpido, pero no conseguí que esto funcione – Magnus

+0

Lo siento, en tu caso, no funcionaría. Este código no funciona con zonas horarias. Más tarde intentaré cambiarlo. –

0

para aumentar la respuesta aceptada por Bruce @Programmer puede simplemente usar esto:

public static Long getTime(String date) { 
    if (Utils.isEmpty(date)) 
     return -1l; 
    String t = date.substring(date.indexOf('(') + 1); 
    if (date.contains("+")) 
     t = t.substring(0, t.indexOf('+')); 
    else if (date.contains("-")) 
     t = t.substring(0, t.indexOf('-')); 
    else 
     t = t.substring(0, t.indexOf(')')); 
    return new Long(t); 
}