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 *