C贸mo convertir una cadena en fecha en Java

    Convertir una cadena en una fecha en Java (o cualquier lenguaje de programaci贸n) es una habilidad fundamental y es 煤til saberlo cuando se trabaja en proyectos. A veces, es m谩s f谩cil trabajar con una cadena para representar una fecha y luego convertirla en una Date objeto para su uso posterior.

    En este art铆culo, repasaremos los muchos m茅todos y bibliotecas que puede usar para convertir una cadena Java en un objeto de fecha.

    La API de fecha / hora

    La API de fecha / hora en Java funciona con ISO 8601 formato por defecto, que es (yyyy-MM-dd).

    Todas las fechas siguen este formato de forma predeterminada, y todas las cadenas que se conviertan deben seguirlo si est谩 utilizando el formateador predeterminado.

    analizar gramaticalmente()

    Esta API define una parse() m茅todo que acepta una secuencia de caracteres y utiliza el ISO_LOCAL_DATE formato para analizar la entrada:

    parse(CharSequence);
    

    Alternativamente, puede usar la variante de dos argumentos de este m茅todo, definiendo un formateador diferente:

    parse(CharSequence, DateTimeFormatter);
    

    UN DateTimeFormatter se utiliza para formatear y analizar objetos de fecha y hora en la nueva API de fecha / hora. Todas las clases de fecha y hora de esta API contienen un m茅todo para analizar y formatear, donde cada una acepta un DateTimeFormatter para definir un patr贸n.

    Conversi贸n de una cadena en LocalDate

    UN LocalDate representa una fecha, sin hora en formato ISO-8601.

    Se diferencia de Date en el hecho de que no almacena el tiempo como una compensaci贸n de milisegundos desde la 茅poca, sino simplemente la fecha actual. Tambi茅n es una implementaci贸n m谩s reciente de la API de fecha / hora y ofrece su propio m茅todo de formato / an谩lisis, as铆 como la suma y resta de d铆as, semanas y a帽os, que no existe en la variante de fecha.

    Para convertir una cadena en un LocalDate objeto, es suficiente escribir:

    LocalDate date = LocalDate.parse("2018-09-16");
    

    Esto es el equivalente a escribir el c贸digo de procedimiento para instanciar un LocalDate objeto:

    LocalDate date = LocalDate.of(2018, 09, 16);
    

    Conversi贸n de una cadena a LocalTime

    LocalTime representa la hora, sin una zona horaria en formato ISO-8601. No almacena el tiempo basado en el desplazamiento desde la 茅poca y ofrece una precisi贸n de nanosegundos.

    Al igual que LocalDate, proporciona una gran cantidad de m茅todos de an谩lisis y formato muy 煤tiles integrados, as铆 como los medios para sumar o restar tiempo.

    Para convertir una cadena en un LocalTime objeto, es suficiente escribir:

    LocalTime localTime = LocalTime.parse("8:00");
    

    Este es el equivalente a escribir el c贸digo de procedimiento para instanciar un LocalTime objeto:

    LocalTime localTime = LocalTime.of(8, 00);
    

    Conversi贸n de una cadena en LocalDateTime

    los LocalDateTime es la clase m谩s utilizada con respecto a la fecha / hora en Java. Representa una combinaci贸n de fecha y hora y se puede utilizar para muchos prop贸sitos:

    LocalDateTime localDateTime = LocalDateTime.parse("2018-09-16T08:00:00");
    

    Este formato puede parecer confuso al principio, pero en realidad es bastante simple:

    El marcador “Tiempo” simplemente representa una l铆nea entre el LocalDate y LocalTime partes del formato.

    Tambi茅n puede formatear f谩cilmente este LocalDateTime en un formato m谩s legible:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String formatDateTime = localDateTime.format(formatter);
    

    Ejecutando este c贸digo e imprimiendo formatDateTime rendir铆a:

    2018-09-16 08:00:00
    

    Por lo general, har铆a esto para mostrar el resultado al usuario final en formato de cadena, mientras realiza operaciones en el LocalDateTime objeto de antemano.

    Conversi贸n de una cadena en ZonedDateTime

    Dependiendo del proyecto en el que est茅 trabajando, es posible que deba manejar diferentes zonas horarias cuando se trata de fechas y horas.

    Convertir una cadena en una ZonedDateTime el objeto es tan simple como:

    ZonedDateTime zonedDateTime = ZonedDateTime.parse("2018-09-16T08:00:00+00:00[Europe/London]");
    

    El ejemplo anterior muestra c贸mo inicializar铆a un ZonedDateTime para Londres.

    Conversi贸n de una cadena con un formateador personalizado

    A veces, podr铆amos desear usar nuestro propio formateador personalizado, que acepta una cadena de las formas m谩s variadas y a煤n as铆 no arroja un DateTimeParseException.

    Estos son algunos de los patrones m谩s comunes que usar铆a:

    • y: A帽o (2018, 18)
    • M: Mes en un a帽o (agosto, agosto, 08)
    • d: D铆a en un mes (1, 5, 25)
    • E: Nombre de un d铆a de la semana (lunes, s谩bado)
    • a: Marcador ante meridiem / post meridiem (AM, PM)
    • H: Hora en estilo 24h (1, 7, 14, 21)
    • h: Hora en un estilo de 12 h (1, 5, 12)
    • m: Minuto en una hora (1, 25, 54)
    • s: Segundo en un minuto (1, 25, 54)

    Y algunos quiz谩s no los uses tan a menudo:

    • G: Designador de 茅poca (AD, CE)
    • Y: A帽o de la semana (2018, 18)
    • w: Semana en un a帽o (25, 53)
    • W: Semana en un mes (2)
    • D: D铆a del a帽o (254)
    • F: D铆a de la semana en un mes (3)
    • E: Nombre del d铆a en una semana (lunes, lunes)
    • u: N煤mero de d铆a de la semana (1, 4)
    • k: Hora en un d铆a (17)
    • K: Hora del d铆a en AM / PM (5)
    • S: Milisegundo (1245)
    • z: Zona horaria general (hora est谩ndar del Pac铆fico; PST; GMT-8: 00)
    • Z: RFC 822 Zona horaria (-0800)
    • X: Zona horaria ISO 8601 (-08, -0800, -8: 00)

    Nota: El a帽o de la semana difiere de un a帽o: un a帽o de la semana est谩 sincronizado con un a帽o WEEK_OF_YEAR ciclo. Todas las semanas entre la primera y la 煤ltima semana (inclusive) tienen el mismo valor de a帽o de semana. Por lo tanto, el primer y 煤ltimo d铆a de un a帽o de la semana pueden tener diferentes valores de a帽o calendario.

    Nota: K y H difieren de la misma manera k y h diferir de. H y h se refieren al modelo 0-23 y 1-12 respectivamente, mientras K y k consulte el 0-11 y el 1-24 respectivamente.

    Si esto a煤n no satisface su necesidad de un formateador personalizado, puede usar DateTimeFormatterBuilder para construir formateadores muy espec铆ficos y complejos. Entre otras cosas, DateTimeFormatter se crea utilizando esta clase.

    java.util.Date

    Este es un enfoque m谩s antiguo, que no se usa con frecuencia hoy en d铆a, pero a煤n vale la pena cubrirlo ya que a veces todav铆a usamos las clases de estas API:

    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
    
    Date date = formatter.parse("22-Sep-2018");
    

    Hay muchos patrones que podemos pasar al constructor de SimpleDateFormat. Puede combinar pr谩cticamente cualquier cantidad de formatos utilizando los patrones disponibles.

    No es posible establecer una zona horaria para una fecha, porque simplemente no contiene dicha informaci贸n. Sin embargo, es f谩cil formatear la fecha y agregar la informaci贸n de la zona horaria a una cadena:

    SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a");
    formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
    
    Date date = formatter.parse("22-09-2018 08:23:43 PM");
    String formattedDate = formatter.format(date);
    
    System.out.println(date);
    System.out.println(formattedDate);
    

    Ejecutar este fragmento de c贸digo producir谩:

    Sat Sep 22 22:23:43 CEST 2018
    22-9-2018 08:23:43 PM
    

    “22:23:43 CEST” corresponde a la hora “10:23:43 PM”, mientras que la fecha formateada representa “8:23:43 PM” ya que est谩 en una zona horaria diferente.

    SimpleDateFormat vs DateTimeFormatter

    Al leer este art铆culo, es justo plantear la pregunta: “驴Cu谩l es la diferencia y cu谩l deber铆a usar?”

    DateTimeFormatter se ha agregado en Java 8 con la nueva API de fecha / hora, y reemplaza a la anterior, que ahora se usa con menos frecuencia SimpleDateFormat. Es seguro para subprocesos a diferencia de su contraparte anterior y ofrece una nueva funcionalidad:

    // SimpleDateFormat
    SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy");
    Date date = new Date();
    String formattedDate = formatter.format(date);
    Date parsedDate = formatter.parse(formattedDate);
    
    // DateTimeFormatter
    LocalDate date = LocalDate.now();
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-M-yyyy");
    String formattedDate = date.format(formatter);
    LocalDate parsedDate = LocalDate.parse(formattedDate, formatter);  
    

    Est谩 claro ver la diferencia entre estos dos. De la forma anterior, se usa un formateador para formatear y luego analizar la fecha. En la forma m谩s reciente, las fechas tienen su propio formato y m茅todos de an谩lisis y usan un DateTimeFormatter simplemente por el patr贸n.

    Si est谩 usando Java 8 y la nueva API, use DateTimeFormatter, mientras que si todav铆a usa una versi贸n anterior de Java, use SimpleDateFormat.

    Joda-Time

    Joda-Time fue desarrollado para contrarrestar los problemas con las antiguas clases de fecha y hora de Java.

    A partir de Java 8, estos problemas se han corregido y Joda-Time ha cumplido su prop贸sito. Incluso los autores aconsejan migrar a java.time trabajar con fechas y horas.

    En el caso de que esto sea imposible, y para aquellos que todav铆a usan una versi贸n de Java anterior a Java 8, Joda-Time sigue siendo una gran biblioteca para usar.

    Se puede agregar f谩cilmente una dependencia para esta biblioteca con un Maven dependencia:

    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>{version}</version>
    </dependency>
    

    Trabajar con Joda-Time es muy similar a trabajar con la API de fecha / hora de Java:

    DateTimeFormatter formatter = DateTimeFormatter.forPattern("dd-MM-yyyy HH:mm:ss");
    
    DateTime dateTime = DateTime.parse("22-Sep-2018 8:15:43", formatter);
    

    De Joda-Time DateTime la clase tambi茅n admite zonas horarias:

    DateTimeFormatter formatter = DateTimeFormatter.forPattern("dd-MM-yyyy HH:mm:ss");
    
    DateTime dateTime = DateTime.parse("22-Sep-2018 8:15:43", formatter);
    DateTime dateTimeZoned = dateTime.withZone(DateTimeZone.forID("Europe/London));
    

    Para obtener una lista completa de los ID de zona horaria disponibles para su uso, visite el documentos oficiales.

    Apache Commons

    Apache Commons es una biblioteca 煤til que se utiliza en muchos proyectos.

    Para agregar esta biblioteca a su proyecto, puede usar la dependencia de Maven:

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>{version}</version>
    </dependency>
    

    Las dos implementaciones siguientes aceptan una serie de patrones. Estos m茅todos analizar谩n cada patr贸n tras otro. Si ning煤n patr贸n coincide con la cadena de entrada, ParseException es aventado.

    Usando DateTimeConverter

    DateTimeConverter dtc = new DateConverter();
    dtc.setPatterns(new String[] { "yyyy-MM-dd", "yyyy-MM-dd hh:mm:ss" });
    ConvertUtils.register(dtc, Date.class);
    

    Usando DateUtils

    Date date = DateUtils.parseDate("22-Sep-2018", String[] {"dd-MM-yyyy HH:mm:ss", "dd-MM-yyyy"});
    

    Conclusi贸n

    Hemos cubierto varias formas de convertir una cadena simple en clases de fecha y fecha y hora en Java. Algunos de estos enfoques utilizan bibliotecas de terceros que es posible que ya tenga en su proyecto, y algunos se terminan utilizando las API que ofrece Java.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *