usar - parse date java
Analizar cadena de fecha para algĂșn objeto Java (6)
tl; dr
LocalDateTime ldt = LocalDateTime.parse( "2012-01-10 23:13:26".replace( " " , "T" ) );
…y…
LocalDate localDate = LocalDate.parse ( "January 13, 2012" , DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US ) );
Detalles
La respuesta de Jonik es básicamente correcta, pero omite algunos problemas importantes.
java.time
Si hay algo mejor que Joda, házmelo saber también.
Sí, hay algo mejor, el marco java.time . El equipo de Joda-Time recomienda la migración a java.time como su sucesor.
El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las antiguas clases problemáticas de fecha y hora, como java.util.Date
, .Calendar
y java.text.SimpleDateFormat
.
Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones.
Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport y se adapta aún más a Android en ThreeTenABP .
Fecha y hora
Su primera entrada es una fecha más una hora del día. Carece de información de offset-from-UTC o zona horaria , por lo que la LocalDateTime
como un objeto LocalDateTime
. El "Local ..." significa cualquier localidad, no localidad específica. Por lo tanto, no es un momento real en la línea de tiempo, sino más bien una idea aproximada de un momento.
Para analizar la cadena de entrada 2012-01-10 23:13:26
podemos reemplazar el ESPACIO en el medio con una T
para cumplir con el estilo canónico para el formato estándar ISO 8601 de valores de fecha y hora.
Las clases java.time usan formatos ISO 8601 de forma predeterminada al analizar y generar representaciones textuales de valores de fecha y hora. Entonces no hay necesidad de definir un patrón de análisis.
String input = "2012-01-10 23:13:26".replace( " " , "T" );
LocalDateTime ldt = LocalDateTime.parse( input );
Si conoce el huso horario previsto en el contexto de este valor, aplíquelo para definir un momento real en la línea de tiempo.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
Volcado a la consola.
System.out.println ( "input: " + input + " | zdt: " + zdt );
entrada: 2012-01-10T23: 13: 26 | zdt: 2012-01-10T23: 13: 26-05: 00 [América / Montreal]
Solo fecha
La segunda de las entradas es un valor de solo fecha sin hora del día y sin zona horaria. Para eso necesitamos la clase LocalDate
.
Reconozco que el formato de esa entrada cumple con el lenguaje (inglés) y las normas culturales de los Estados Unidos. Entonces no es necesario especificar explícitamente un patrón de formateo. Simplemente podemos solicitar un formateador que conozca ese formato de EE. UU. Al especificar una Locale
. Especificamos FormatStyle.LONG
según corresponda para la longitud de este formato.
String input = "January 13, 2012";
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US );
LocalDate localDate = LocalDate.parse ( input , formatter );
Volcado a la consola.
System.out.println ( "input: " + input + " | localDate: " + localDate );
entrada: 13 de enero de 2012 | localFecha: 2012-01-13
Estoy trabajando en un proyecto que lee archivos y procesa datos. Ahí tengo que trabajar con las fechas, por ejemplo:
- 2012-01-10 23:13:26
- 13 de enero de 2012
Encontré el paquete Joda, un paquete un tanto interesante, pero no sé si es el más fácil.
Pude analizar el primer ejemplo de un objeto DateTime (Joda) reg-ex y manipulación de cadenas. (Por ejemplo, reemplazando el espacio por ''-'' y pasándolo al constructor.
new DateTime("2012-01-10 23:13:26".replace('' '', ''-''))
Supongo que funcionó, pero el problema está en el segundo formato. ¿Cómo puedo usar una entrada de este tipo para extraer un objeto, preferiblemente un objeto Joda? Estoy seguro de que puedo escribir una función para cambiar el formato a lo que Joda admite, pero me preguntaba si habría alguna otra forma (incluso alguna biblioteca nativa de Java) para hacerlo.
Si hay algo mejor que Joda, házmelo saber también.
Gracias.
JodaTime se considera en gran medida el estándar de facto para el procesamiento de fecha y hora en Java; están trabajando para que se lo agregue a la próxima versión de la biblioteca de Java (bueno, efectivamente).
Para obtener fechas de JodaTime a partir de cadenas, querrá consultar la clase DateTimeFormat .
Lo más fácil sería configurar SimpleDateFormat correctamente según el formato que esperaría y usar su método de análisis para darle un objeto Date
Me imagino que Joda tiene algo de un formateador para hacer esto por ti. Encontré esto con una búsqueda rápida en Google: http://johannburkard.de/blog/programming/java/date-time-parsing-formatting-joda-time.html
DateTimeFormatter parser1 =
DateTimeFormat.forPattern("dd/MMM/yyyy:HH:mm:ss Z");
DateTimeFormatter parser2 =
DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");
DateTime time = parser1.parseDateTime("<data>");
La sintaxis que se usa para evaluar los patrones se puede encontrar en el enlace de X-Zero .
SimpleDateFormat analizará las fechas en los objetos Fecha de Java:
http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); // first example
SimpleDateFormat format2 = new SimpleDateFormat("MMMMM dd,yyyy"); // second example
Date d1 = format1.parse( dateStr1 );
Date d2 = format2.parse( dateStr2 );
Usando Joda-Time, eche un vistazo a DateTimeFormat ; permite analizar las dos cadenas de fechas que mencionas (y casi cualquier otro formato arbitrario). Si sus necesidades son aún más complejas, pruebe DateTimeFormatterBuilder .
Para analizar el n. ° 1:
DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime dateTime = f.parseDateTime("2012-01-10 23:13:26");
Editar: en realidad, LocalDateTime es un tipo más apropiado para una fecha y hora sin zona horaria:
LocalDateTime dateTime = f.parseLocalDateTime("2012-01-10 23:13:26");
Y para el # 2:
DateTimeFormatter f = DateTimeFormat.forPattern("MMMM dd, yyyy");
LocalDate localDate = f.parseLocalDate("January 13, 2012");
Y sí, Joda-Time es definitivamente el camino a seguir, en lo que respecta al manejo de fecha y hora de Java. :)
Como casi todos estarán de acuerdo, Joda es una biblioteca excepcionalmente fácil de usar. Por ejemplo, nunca antes había hecho este tipo de análisis con Joda, pero me tomó solo unos minutos encontrarlo en la API y escribirlo.
Actualización (2015)
Si tiene Java 8 , en la mayoría de los casos, simplemente debe usar java.time
lugar de Joda-Time. Contiene casi todas las cosas buenas, o sus equivalentes, de Joda. Para aquellos que ya están familiarizados con las API de Joda, la guía de migración Joda-Time to java.time de Stephen Colebourne es útil.
Aquí están las versiones de java.time de los ejemplos anteriores.
Para analizar el n. ° 1:
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.from(f.parse("2012-01-10 23:13:26"));
No puede analizar esto en ZonedDateTime o OffsetDateTime (que son contrapartidas del DateTime de Joda, utilizado en mi respuesta original), pero eso tiene sentido porque no hay información de zona horaria en la cadena analizada.
Para analizar el n. ° 2:
DateTimeFormatter f = DateTimeFormatter.ofPattern("MMMM dd, yyyy");
LocalDate localDate = LocalDate.from(f.parse("January 13, 2012"));
Aquí LocalDate es el tipo más apropiado para analizar (al igual que con Joda-Time).