Tengo la siguiente fecha: 2011-08-12T20:17:46.384Z
. ¿Qué formato es este? Estoy tratando de analizarlo con Java 1.4 a través DateFormat.getDateInstance().parse(dateStr)
y estoy obteniendo
java.text.ParseException: fecha no analizable: "2011-08-12T20: 17: 46.384Z"
Creo que debería usar SimpleDateFormat para analizar, pero primero tengo que conocer la cadena de formato. Todo lo que tengo para eso hasta ahora es yyyy-MM-dd
, porque no sé qué T
significa en esta cadena, ¿algo relacionado con la zona horaria? Esta cadena de fecha proviene de la lcmis:downloadedOn
etiqueta que se muestra en el tipo de medio de historial de descargas de archivos CMIS .
Z
al final es la abreviatura deZulu
y significa UTC . Este formato ciertamente forma parte de la colección ISO 8601 de formatos de texto estándar de fecha y hora. Por cierto, estos formatos estándar se usan por defecto en las clases java.time .java.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y Java 9. Consulte el Tutorial de Oracle .Respuestas:
La T es solo un literal para separar la fecha de la hora, y la Z significa "desplazamiento de hora cero", también conocido como "hora Zulú" (UTC). Si sus cadenas siempre tienen una "Z", puede usar:
O usando Joda Time , puedes usar
ISODateTimeFormat.dateTime()
.fuente
T
yZ
?T
(no recuerdo cómo SimpleDateFormat maneja especificadores desconocidos) peroZ
queremos que sea el carácter 'Z' en lugar de "un valor de desplazamiento UTC" (por ejemplo, "00").tl; dr
El formato estándar ISO 8601 es utilizado por su cadena de entrada.
ISO 8601
Este formato está definido por el estándar práctico sensible, ISO 8601 .
El
T
separa la parte de fecha desde la porción de tiempo de días. ElZ
final significa UTC (es decir, un desplazamiento desde UTC de cero horas-minutos-segundos). ElZ
se pronuncia "Zulu" .java.time
Las antiguas clases de fecha y hora incluidas con las primeras versiones de Java han demostrado ser deficientemente diseñadas, confusas y problemáticas. Evítales.
En su lugar, use java.time marco integrado en Java 8 y posteriores. Las clases java.time suplantan tanto a las antiguas clases de fecha y hora como a la exitosa biblioteca Joda-Time.
Las clases java.time usan ISO 8601 de manera predeterminada al analizar / generar representaciones textuales de valores de fecha y hora.
La
Instant
clase representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos . Esa clase puede analizar directamente su cadena de entrada sin molestarse en definir un patrón de formato.Acerca de java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como
java.util.Date
,Calendar
, ySimpleDateFormat
.El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
¿Dónde obtener las clases java.time?
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como
Interval
,YearWeek
,YearQuarter
, y más .fuente
No estoy seguro sobre el análisis de Java, pero eso es ISO8601: http://en.wikipedia.org/wiki/ISO_8601
fuente
Hay otras formas de analizarlo en lugar de la primera respuesta. Para analizarlo:
(1) Si desea obtener información sobre la fecha y la hora, puede analizarlo en un objeto
ZonedDatetime
(desde Java 8 ) oDate
(antiguo):o
(2) Si no le importa la fecha y la hora y solo desea tratar la información como un momento en nanosegundos, puede usar
Instant
:fuente
Si están buscando una solución para Android, pueden usar el siguiente código para obtener los segundos de la cadena de la marca de tiempo.
Entrada de muestra: 2019-10-15T05: 51: 31.537979Z
Salida de muestra: 1571128673
fuente
Puedes usar el siguiente ejemplo.
fuente
Z
. Eso significa esperar pero ignorar esa carta. Pero esa carta no debe ser ignorada. Esa carta proporciona información valiosa, el hecho de que la cadena estaba destinada a UTC, un desplazamiento de cero. Su formato está descartando este hecho importante. Además, no hay necesidad de molestarse en definir este patrón de formato. Se incorpora un formateador para este patrón.Esta técnica traduce java.util.Date al formato UTC (o cualquier otro) y viceversa.
Defina una clase así:
}
Entonces úsalo así:
o
También puede definir otros formatos de fecha si lo requiere (no solo UTC)
fuente
java.util.Date
y el proyecto Joda-Time fueron suplantados hace años por las modernas clases java.time definidas en JSR 310. El consejo aquí está desactualizado hace mucho tiempo.@ John-Skeet me dio la pista para solucionar mi propio problema en torno a esto. Como programador más joven, este pequeño problema es fácil de perder y difícil de diagnosticar. Así que lo comparto con la esperanza de que ayude a alguien.
Mi problema era que quería analizar la siguiente cadena contraviniendo una marca de tiempo de un JSON sobre el que no tengo influencia y ponerla en variables más útiles. Pero seguí recibiendo errores.
Entonces, dado lo siguiente (preste atención al parámetro de cadena dentro de Pattern ();
Error:
¿El problema? La Z al final del Patrón debe estar envuelta en 'Z' al igual que la 'T'. Cambiar
"yyyyMMdd'T'HHmmss.SSSZ"
a"yyyyMMdd'T'HHmmss.SSS'Z'"
y funciona.Eliminar la Z del patrón en conjunto también condujo a errores.
Francamente, esperaría que una clase Java hubiera anticipado esto.
fuente
T
es un literal y necesita ser citado,Z
es un desplazamiento (de cero) y debe analizarse como tal, o obtendrá resultados incorrectos. No sé a qué te refieres con que no se ha previsto, creo que sí.Z
. Estás descartando información valiosa. ¡Procesar un valor de fecha y hora mientras se ignora la zona horaria o el desplazamiento desde UTC es como procesar una cantidad de dinero mientras se ignora la moneda!T
simplemente separa la parte de la fecha de la parte de la hora del día, y no agrega ningún significado. ElZ
por otro lado definitivamente agrega significado.