localdatetime - Fecha JSON a la fecha de Java?
send date json java (3)
Esta pregunta ya tiene una respuesta aquí:
No pude encontrar esto en ninguna parte. Busco algunos JSON de una API que devuelve fechas JSON estándar. Puede ver el formato ejecutando este código en una consola de JavaScript:
> new Date().toJSON();
"2010-10-27T11:58:22.973Z"
Bueno, en realidad, la API con la que estoy trabajando no devuelve la parte en milisegundos, y algunas veces devuelve una zona horaria en lugar de Z
, por lo que las fechas pueden parecerse a cualquiera de estas:
-
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!
Ese formato de DateTime es en realidad 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.
Si está abierto a usar algo más que las clases integradas de Fecha / Hora / Calendario de Java, también le sugiero Joda Time . Ofrecen (entre otras cosas) un ISODateTimeFormat
para analizar este tipo de cadenas.
Si necesita admitir más de un formato, tendrá que ajustar el patrón de su 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ás lidiando con un error en la API que estás usando y que ha citado el patrón de Z
zona horaria en alguna parte ...
Tenga en cuenta que el formato de formato SimpleDateFormat Z es para la zona horaria RFC 822 y el patrón X para ISO 8601 (este estándar admite nombres de zona horaria de una sola letra como Z para Zulu).
Así que el 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.
Desafortunadamente, por lo que puedo decir, no se puede obtener este formato para generar la versión de Z para Zulu, que es molesto.
De hecho, tengo más problemas en el lado de JavaScript para tratar con ambos formatos.