util simple parse example java parsing date simpledateformat

java - example - simpledateformat parse



Formato Java aaaa-MM-dd''T''HH: mm: ss.SSSz a aaaa-mm-dd HH: mm: ss (6)

Estoy tratando de formatear una fecha en formato aaa-MM-dd''T''HH: mm: ss.SSSz aaaaa-mm-dd HH: mm: ss, lo cual debería ser fácil pero no puedo hacerlo funcionar .

Una fecha que debe analizarse tiene la forma de: 2012-10-01T09: 45: 00,000 + 02: 00
Ahora uso este formateador de fecha simple para formatearlo:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ss.SSSz", Locale.FRANCE);

sin embargo, esto da una salida similar a 2012-10-01T09: 45: 00.000UTC + 00: 00.

También he intentado usar "aaaa-MM-dd''T''HH: mm: ss.SSSZ" como patrón y "aaaa-MM-ddHH: mm: ss". Este último devuelve una fecha en la forma de 2012-10-01T09: 45: 00 cerca, pero aún no está allí.

Pensé que separar la T sería un poco desordenado y crearía gastos indirectos sin ninguna razón, por lo tanto, ¿cuál sería la forma correcta de formatear estas fechas?

Para ilustrar, me gustaría convertir 2012-10-01T09: 45: 00.000 + 02: 00 en 2012-10-01 09:45:00

¡Aclamaciones!


java.time

Tenemos una nueva tecnología para este problema: el marco java.time integrado en Java 8 y posterior.

Su cadena de entrada está en formato estándar ISO 8601. Ese estándar se utiliza por defecto en las clases java.time para analizar / generar representaciones textuales de valores de fecha y hora.

OffsetDateTime odt = OffsetDateTime.parse( "2012-10-01T09:45:00.000+02:00" );

Su pregunta sugiere que desea truncar a un segundo completo.

OffsetDateTime odtTruncatedToWholeSecond = odt.truncatedTo( ChronoUnit.SECONDS );

Parece que quieres omitir el desplazamiento y la información de la zona horaria. El formateador predefinido DateTimeFormatter.ISO_LOCAL_DATE_TIME hace eso.

Y aparentemente desea usar un espacio en el medio en lugar del estándar T Podrías definir tu propio formateador para esto, pero solo haría una manipulación de cadena para reemplazar la T con un ESPACIO.

String output = odtTruncatedToWholeSecond.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ).replace( "T" , " " );

Simplemente manipulaciones de cadena

Como sugieren los comentarios sobre la Cuestión, en términos estrictos puede lograr su objetivo trabajando únicamente con cadenas y sin convertir objetos en cualquier momento de la fecha. Pero proporciono esta respuesta aquí asumiendo que puede tener otra lógica comercial para trabajar con estos valores de fecha y hora.

Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases legacy fecha y hora como java.util.Date , 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 busque para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

Puede intercambiar objetos java.time directamente con su base de datos. Use un controlador JDBC que cumpla con JDBC 4.2 o posterior. Sin necesidad de cadenas, sin necesidad de clases java.sql.* .

¿Dónde obtener las clases de java.time?

  • Java SE 8 , Java SE 9 y posterior
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Android
    • Versiones posteriores de las implementaciones del paquete de Android de las clases java.time.
    • Para Android anterior, el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP ....

El proyecto ThreeTen-Extra amplía 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 .


Estaba intentando formatear la cadena de fecha recibida de una respuesta JSON, por ejemplo, 2016-03-09T04: 50: 00-0800 aaaaa-MM-dd. Así que esto es lo que probé y funcionó y me ayudó a asignar la cadena de fecha formateada a un widget de calendario.

String DATE_FORMAT_I = "yyyy-MM-dd''T''HH:mm:ss"; String DATE_FORMAT_O = "yyyy-MM-dd"; SimpleDateFormat formatInput = new SimpleDateFormat(DATE_FORMAT_I); SimpleDateFormat formatOutput = new SimpleDateFormat(DATE_FORMAT_O); Date date = formatInput.parse(member.getString("date")); String dateString = formatOutput.format(date);

Esto funcionó. Gracias.


Si es posible usar Joda Time en su proyecto, entonces este código funciona para mí:

String dateStr = "2012-10-01T09:45:00.000+02:00"; String customFormat = "yyyy-MM-dd HH:mm:ss"; DateTimeFormatter dtf = ISODateTimeFormat.dateTime(); LocalDateTime parsedDate = dtf.parseLocalDateTime(dateStr); String dateWithCustomFormat = parsedDate.toString(DateTimeFormat.forPattern(customFormat)); System.out.println(dateWithCustomFormat);


Si realmente tienes que ser rápido (no es lo que creo que haces):

char[] chars = sourceDate.toCharArray(); chars[10] = '' ''; String targetDate = new String(chars, 0, 19);


SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ss"); SimpleDateFormat output = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date d = sdf.parse(time); String formattedTime = output.format(d);

Esto funciona. Tienes que usar dos SimpleDateFormats, uno para la entrada y otro para la salida, pero te dará exactamente lo que te faltan.


String dateStr = "2016-09-17T08:14:03+00:00"; String s = dateStr.replace("Z", "+00:00"); s = s.substring(0, 22) + s.substring(23); Date date = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ssZ").parse(s); Timestamp createdOn = new Timestamp(date.getTime()); mcList.setCreated_on(createdOn);

Java 7 agregó soporte para descriptores de zona horaria según ISO 8601. Esto se puede usar en Java 7.