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.