yyyy simple parse example change java date time format simpledateformat

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; }