Convertir cadena a fecha en Java

1. Información general

En este tutorial, exploraremos varias formas de convertir objetos String en objetos Date . Comenzaremos con la nueva API de fecha y hora : java.time que se introdujo en Java 8 antes de analizar el antiguo tipo de datos java.util.Date que también se usa para representar fechas.

Para terminar, también veremos algunas bibliotecas externas para la conversión usando Joda-Time y la clase Apache Commons Lang DateUtils .

2. Conversión de cadena a LocalDate o LocalDateTime

LocalDate y LocalDateTime son objetos de fecha y hora inmutables que representan una fecha y, posteriormente, una fecha y una hora. Por defecto, las fechas de Java están en el formato ISO-8601, por lo que si tenemos alguna cadena que represente una fecha y hora en este formato, entonces podemos usar la API parse () de estas clases directamente .

Aquí hay un poco más de detalles sobre esta nueva API.

2.1. Usando la API de Parse

La API de fecha y hora proporciona métodos parse () para analizar una cadena que contiene información de fecha y hora. Para convertir objetos String en objetos LocalDate y LocalDateTime , String debe representar una fecha u hora válida según ISO_LOCAL_DATE o ISO_LOCAL_DATE_TIME.

De lo contrario, se lanzará una DateTimeParseException en tiempo de ejecución.

En nuestro primer ejemplo, convertiremos un String en un java.time . LocalDate :

LocalDate date = LocalDate.parse("2018-05-05");

Se puede usar un enfoque similar al anterior para convertir un String en un java.time . LocalDateTime :

LocalDateTime dateTime = LocalDateTime.parse("2018-05-05T11:50:55");

Es importante tener en cuenta que los objetos LocalDate y LocalDateTime son independientes de la zona horaria. Sin embargo, cuando necesitamos lidiar con la fecha y hora específicas de la zona horaria, podemos usar el método de análisis ZonedDateTime directamente para obtener una fecha y hora específica de la zona horaria:

ZonedDateTime zonedDateTime = ZonedDateTime.parse("2015-05-05T10:15:30+01:00[Europe/Paris]");

Ahora echemos un vistazo a cómo convertimos cadenas con un formato personalizado.

2.2. Usar la API de Parse con un formateador personalizado

Convertir una cadena con un formato de fecha personalizado en un objeto de fecha es una operación muy extendida en Java.

Para este propósito, usaremos la clase DateTimeFormatter que proporciona numerosos formateadores predefinidos y nos permite definir un formateador.

Comencemos con un ejemplo del uso de uno de los formateadores predefinidos de DateTimeFormatter :

String dateInString = "19590709"; LocalDate date = LocalDate.parse(dateInString, DateTimeFormatter.BASIC_ISO_DATE);

En el siguiente ejemplo, creemos un formateador que aplica un formato de "EEE, MMM d aaaa". Este formato especifica tres caracteres para el nombre del día completo de la semana, un dígito para representar el día del mes, tres caracteres para representar el mes y cuatro dígitos para representar el año.

Este formateador reconoce cadenas como " Vie, 3 de enero de 2003" o "Mié, 23 de marzo de 1994 ":

String dateInString = "Mon, 05 May 1980"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, d MMM yyyy", Locale.ENGLISH); LocalDate dateTime = LocalDate.parse(dateInString, formatter);

2.3. Patrones comunes de fecha y hora

Veamos algunos patrones comunes de fecha y hora:

  • y - Año (1996; 96)
  • M - Mes del año (julio; julio; 07)
  • d - Día del mes (1-31)
  • E - Nombre del día en la semana (viernes, domingo)
  • a - marcador am / pm (am, pm)
  • H - Hora del día (0-23)
  • h - Hora en am / pm (1-12)
  • m - Minuto en hora (0-60)
  • s - Segundo en minuto (0-60)

Para obtener una lista completa de símbolos que podemos usar para especificar un patrón de análisis, haga clic aquí.

Si necesitamos convertir las fechas java.time en el objeto java.util.Date más antiguo , lea este artículo para obtener más detalles.

3. Conversión de cadena a java.util.Date

Antes de Java 8, el mecanismo de fecha y hora de Java lo proporcionaban las API antiguas de las clases java.util.Date , java.util.Calendar y java.util.TimeZone con las que a veces todavía necesitamos trabajar.

Veamos cómo convertir un String en un objeto java.util.Date :

SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH); String dateInString = "7-Jun-2013"; Date date = formatter.parse(dateInString);

En el ejemplo anterior, primero necesitamos construir un objeto SimpleDateFormat pasando el patrón que describe el formato de fecha y hora.

A continuación, necesitamos invocar el método parse () pasando la cadena de fecha . Si el argumento de cadena que se pasa no tiene el mismo formato que el patrón, se lanzará una ParseException .

3.1. Adición de información de zona horaria a java.util.Date

Es importante tener en cuenta que java.util.Date no tiene concepto de zona horaria , y solo representa el número de segundos transcurridos desde la época de Unix - 1970-01-01T00: 00: 00Z.

Pero, cuando imprimimos el objeto Date directamente, siempre se imprimirá con la zona horaria predeterminada del sistema de Java.

En este ejemplo final, veremos cómo formatear una fecha, agregando información de la zona horaria:

SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a", Locale.ENGLISH); formatter.setTimeZone(TimeZone.getTimeZone("America/New_York")); String dateInString = "22-01-2015 10:15:55 AM"; Date date = formatter.parse(dateInString); String formattedDateString = formatter.format(date);

También podemos cambiar la zona horaria de la JVM mediante programación, pero esto no se recomienda:

TimeZone.setDefault(TimeZone.getTimeZone("GMT"));

4. Bibliotecas externas

Ahora que tenemos una buena comprensión de cómo convertir objetos String en objetos Date utilizando las API nuevas y antiguas que ofrece el núcleo de Java, echemos un vistazo a algunas bibliotecas externas.

4.1. Biblioteca de Joda-Time

An alternative to the core Java Date and Time library is Joda-Time. Although the authors now recommend users to migrate to java.time (JSR-310) if this isn't possible then the Joda-Time library provides an excellent alternative for working with Date and Time. This library provides pretty much all capabilities supported in the Java 8 Date Time project.

The artifact can be found on Maven Central:

 joda-time joda-time 2.10 

Here’s a quick example working with the standard DateTime:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"); String dateInString = "07/06/2013 10:11:59"; DateTime dateTime = DateTime.parse(dateInString, formatter);

Let's also see an example of explicitly setting a time zone:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"); String dateInString = "07/06/2013 10:11:59"; DateTime dateTime = DateTime.parse(dateInString, formatter); DateTime dateTimeWithZone = dateTime.withZone(DateTimeZone.forID("Asia/Kolkata"));

4.2. Apache Commons Lang – DateUtils

La clase DateUtils proporciona muchas utilidades útiles que facilitan el trabajo con los objetos heredados Calendar y Date .

El artefacto commons-lang3 está disponible en Maven Central:

 org.apache.commons commons-lang3 3.7 

Convirtamos una cadena de fecha usando una matriz de patrones de fecha en un java.util.Date :

String dateInString = "07/06-2013"; Date date = DateUtils.parseDate(dateInString, new String[] { "yyyy-MM-dd HH:mm:ss", "dd/MM-yyyy" });

5. Conclusión

En este artículo, ilustramos varias formas de convertir cadenas a diferentes tipos de objetos Date (con y sin tiempo), tanto en Java simple como usando bibliotecas externas.

El código fuente completo del artículo está disponible en GitHub.