2010-10-27 32 views
30

No pude encontrar esto en ninguna parte. Busco algunos JSON de una API que devuelve fechas JSON estándar. Se puede ver el formato mediante la ejecución de este código en una consola de JavaScript:Fecha JSON a la fecha de Java?

> new Date().toJSON(); 
"2010-10-27T11:58:22.973Z" 

Bueno, en realidad, la API Estoy trabajando con no devuelve la parte de milisegundos, y en ocasiones se vuelve una zona horaria en lugar de Z, por lo fechas pueden parecerse a cualquiera de estos:

  • 2010-10-27T11:58:22Z
  • 2010-10-27T11:58:22+03:00

El análisis de este tipo de fechas es algo engorroso. ¿Hay alguna forma de analizar este tipo de fechas, usando org.json?

Mi solución actual es:

public static Date parseDateTime(String dateString) { 
    if (dateString == null) return null; 
    DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ"); 
    if (dateString.contains("T")) dateString = dateString.replace('T', ' '); 
    if (dateString.contains("Z")) dateString = dateString.replace("Z", "+0000"); 
    else 
     dateString = dateString.substring(0, dateString.lastIndexOf(':')) + dateString.substring(dateString.lastIndexOf(':')+1); 
    try { 
     return fmt.parse(dateString); 
    } 
    catch (ParseException e) { 
     Log.e(Const.TAG, "Could not parse datetime: " + dateString); 
     return null; 
    } 
} 

Uf!

+0

En un comentario más abajo, se mencionó que va a implementar para Android. ¿Has probado el 'ZZZZZ' de Android' SimpleDateFormat''? –

Respuesta

17

Ese formato DateTime es en realidad la norma ISO 8601 DateTime. JSON no especifica ningún formato particular para las fechas/horas. Si Google un poco, encontrará muchas implementaciones para analizarlo en Java.

Here's one

Si usted está abierto a usar algo que no sea de Java incorporado Fecha/classes/Calendario tiempo, me gustaría también sugieren Joda Time. Ofrecen (entre otras cosas) un ISODateTimeFormat para analizar este tipo de cadenas.

+0

+1 para la recomendación de tiempo Joda –

+0

Hmm, interesante. Su solución es bastante similar a la mía :). Es extraño que Java no tenga esto incorporado, si es estándar. – Felix

+0

En cuanto a Joda Time, mi proyecto está en Android y quiero usar las menores libs externas posibles. Gracias por el consejo. Al igual que con – Felix

6

Si tiene que soportar más de un formato que tendrá que coincidir con su patrón de entrada y analizar en consecuencia.

final DateFormat fmt; 
if (dateString.endsWith("Z")) { 
    fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
} else { 
    fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
} 

supongo que está tratando con un error en la API que está utilizando, que ha citado el patrón de fecha Z zona horaria en alguna parte ...

+0

La Z literal es válida; es otra forma de decir '+00: 00', es decir, hora UTC. Significa 'zulu': _ "... también conocido coloquialmente como" Zulu Time ", particularmente en el ejército de los Estados Unidos ..." _ [[Wikipedia] (http://en.wikipedia.org/wiki/ Coordinated_Universal_Time)) –

13

Tenga en cuenta que SimpleDateFormat patrón de formato Z está para RFC La zona horaria 822 y el patrón X son para ISO 8601 (este estándar admite nombres de zona horaria de una sola letra como Z para Zulu).

Así new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX") produce un formato que puede analizar tanto "2013-03-11T01:38:18.309Z" como "2013-03-11T01:38:18.309+0000" y le dará el mismo resultado.

Por desgracia, por lo que yo puedo decir, no se puede conseguir este formato para generar la Z para la versión de Zulu, lo cual es molesto.

realidad tengo más problemas en el lado JavaScript para tratar con ambos formatos.