java - simple - ¿Cuál es este formato de fecha? 2011-08-12T20: 17: 46.384Z
simpledateformat parse (5)
Tengo la siguiente fecha: 2011-08-12T20:17:46.384Z
. ¿Qué formato es este? Estoy intentando analizarlo con Java 1.4 a través de DateFormat.getDateInstance().parse(dateStr)
y DateFormat.getDateInstance().parse(dateStr)
java.text.ParseException: fecha no analizable: "2011-08-12T20: 17: 46.384Z"
Creo que debería estar usando SimpleDateFormat para el análisis, pero primero debo conocer la cadena de formato. Todo lo que tengo para eso hasta ahora es yyyy-MM-dd
, porque no sé qué significa la T
en esta cadena, ¿algo relacionado con la zona horaria? Esta cadena de fecha proviene de la etiqueta lcmis:downloadedOn
muestra en el tipo de medio del historial de descargas de Archivos CMIS .
tl; dr
El formato estándar ISO 8601 es utilizado por su cadena de entrada.
Instant.parse ( "2011-08-12T20:17:46.384Z" )
ISO 8601
Este formato está definido por la norma práctica razonable, ISO 8601 .
La T
separa la parte de la fecha de la parte de la hora del día. La Z
en el final es la abreviatura de Zulu
y significa UTC .
java.time
Las antiguas clases de fecha y hora incluidas con las primeras versiones de Java han demostrado tener un diseño pobre, confuso y problemático. Evítales.
En su lugar, use el marco java.time integrado en Java 8 y java.time posteriores. Las clases de java.time sustituyen tanto a las antiguas clases de fecha y hora como a la exitosa biblioteca Joda-Time.
Las clases java.time utilizan ISO 8601 de manera predeterminada al analizar / generar representaciones textuales de valores de fecha y hora.
La clase Instant
representa un momento en la línea de tiempo en UTC con una resolución de nanoseconds . Esa clase puede analizar directamente su cadena de entrada sin molestarse en definir un patrón de formato.
Instant instant = Instant.parse ( "2011-08-12T20:17:46.384Z" ) ;
Acerca de java.time
El marco java.time está integrado en Java 8 y java.time posteriores. Estas clases sustituyen a las antiguas y problemáticas clases de fecha y hora como java.util.Date
, java.util.Calendar y SimpleDateFormat
.
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 busca para muchos ejemplos y explicaciones. La especificación es JSR 310 .
¿Dónde obtener las clases java.time?
- Java SE 8 , Java SE 9 y posteriores
- Incorporado.
- Parte de la API de Java estándar con una implementación en paquete.
- Java 9 agrega algunas características menores y correcciones.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de java.time está respaldada a Java 6 y 7 en ThreeTen-Backport .
- Android
- Versiones posteriores de las implementaciones de paquetes de Android de las clases java.time.
- Para Android anterior, el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Vea Cómo usar ThreeTenABP… .
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí como Interval
, YearWeek
, YearQuarter
, y more .
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 analizarla en un objeto ZonedDatetime
(desde Java 8 ) o Date
(antiguo):
// ZonedDateTime''s default format requires a zone ID(like [Australia/Sydney]) in the end.
// Here, we provide a format which can parse the string correctly.
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
ZonedDateTime zdt = ZonedDateTime.parse("2011-08-12T20:17:46.384Z", dtf);
o
// ''T'' is a literal.
// ''X'' is ISO Zone Offset[like +01, -08]; For UTC, it is interpreted as ''Z''(Zero) literal.
String pattern = "yyyy-MM-dd''T''HH:mm:ss.SSSX";
// since no built-in format, we provides pattern directly.
DateFormat df = new SimpleDateFormat(pattern);
Date myDate = df.parse("2011-08-12T20:17:46.384Z");
(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
:
// The ISO format without zone ID is Instant''s default.
// There is no need to pass any format.
Instant ins = Instant.parse("2011-08-12T20:17:46.384Z");
La T es solo un literal para separar la fecha de la hora, y la Z significa "compensación de hora cero", también conocida como "hora Zulu" (UTC). Si tus cadenas siempre tienen una "Z" puedes usar:
SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd''T''HH:mm:ss.SSS''Z''", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));
O usando Joda Time , puede usar ISODateTimeFormat.dateTime()
.
La manera fácil de resolver esto es reemplazar la "T"
con " "
y eliminar .384Z
.
A continuación se muestra una ilustración de cómo lograrlo:
public static String getTime(String time) {
if (time != null) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (time.toUpperCase().contains("T") && time.toUpperCase().contains("Z")) {
time = time.toUpperCase().replace("T", " ");
String[] str = time.split("//.");
if (str.length != 0) {
return str[0];
}
}
try {
Date date = new Date(time);
time = simpleDateFormat.format(date);
} catch (Exception e) {
//
}
}
return time;
}
No estoy seguro sobre el análisis de Java, pero eso es ISO8601: http://en.wikipedia.org/wiki/ISO_8601