Usando el Java.Time API

por


Publicado en: enero 8, 2018



Desde el inicio de Java SE, hemos tenido dos clases para manejar fechas y horas: java.util.Date y java.util.Calendar. Si alguna vez se han tomado el tiempo de ver los métodos y atributos de java.util.Date; sepan que esa es la manera de NO diseñar un API. Notarán que casi todos lo métodos estan marcados como deprecated desde Java 1.1 (es decir, alrededor de 1997). En fin, hoy en día aún me resulta común observar el uso de esos API en proyectos creados en Java SE 8.

Pero, en Java SE 8 tenemos un nuevo paquete que corrigue todos los problemas que arrastran esos API; hablo de java.time; el cual esta basado en Joda-Time y que fue desarrollado de acuerdo al JSR-310: Date and Time API

En este artículo, les mostrare algunos usos básicos de este nuevo paquete.

¿Cómo usarlo?


En primer lugar, es importante que sepan que las clases en Date-Time producen instancias inmutables; es decir, son thread safe y además no tienen constructores públicos.

Date-Time tiene múltiples clases como Instant, LocalDate, LocalTime entre otras; y estas poseen dos métodos factory que son: now y of. Now lo que crea es una instancia basada en la fecha y hora actual; y of lo hace a partir de los parámetros que les enviemos.

Por ejemplo:

    System.out.println("LocalDate es: " + LocalDate.now()) ;
    System.out.println("LocalDateTime es: " + LocalDateTime.now()) ;

y que nos da como respuesta:

LocalDate es: 2018-01-08
LocalDateTime es: 2018-01-08T11:38:52.911

Noten como la salida esta formateada de acuerdo al ISO 8601.

Si por otro lado deseamos usar el método of; hacemos esto:

    LocalDate fecha = LocalDate.of(2018, Month.JANUARY, 8);

Importante: Aunque puedes pasar un entero como el mes; les sugiero que mejor emplean un valor del enum Month. La razón? Pues me parece que es mucho más simple de leer; especialmente si tomamos en cuanta que en la clase Calendar el mes iniciaba en 0 (en Date-Time inicia en 1) y sería muy propenso a un error de interpretación por parte del desarrollador.

Operaciones Básicas


Supongamos que ahora necesitas hacer alguna operación sobre una instancia de Date-Time. A manera de ilustración, necesitas sumar o restar días. Pues bien, esto lo logramos de la siguiente manera:

  DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MMM-yyyy");

  LocalDate fechaInicio = LocalDate.of(2018, Month.JANUARY, 8);
  System.out.println(dateFormatter.format(fechaInicio));

  LocalDate fechaFin = fechaInicio.plusDays(5);
  System.out.println(dateFormatter.format(fechaFin));

Ahí también pueden notar el uso del DateTimeFormatter y que nos brinda como respuesta:

08-Jan-2018
13-Jan-2018

Existen métodos adicionales, como plusMinutes, plusHours, plusNanos, plus, minus entre otros.

Y si deseas saber cuantos tiempo ha pasado entre dos eventos; puedes hacer uso del método between.

    LocalDate fechaInicio = LocalDate.of(2018, Month.JANUARY, 8);                
    LocalDate fechaFin = fechaInicio.plusDays(5);

    System.out.println( ChronoUnit.DAYS.between(fechaInicio, fechaFin));

Esto nos da como resultado el valor de 5. Cabe indicar que hay otras constantes en ChronoUnit como HOURS, WEEKS, MONTHS, YEARS, DECADES, CENTURIES.

Por último, a veces uno requiere tomar una fecha y a partir de ella realizar ajustes para encontrar cosas como por ejemplo el siguiente viernes luego de una fecha; o el último día del mes. Para eso se usa la clase TemporalAdjusters.

  LocalDate fechaInicio = LocalDate.of(2018, Month.JANUARY, 8);                

  LocalDate proximoViernes = fechaInicio.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
  System.out.println( proximoViernes);

  LocalDate fechaFin = fechaInicio.with(TemporalAdjusters.lastDayOfMonth());

  System.out.println( fechaFin);

Y esto nos daría que el próximo viernes es 12 de enero y que el último día del mes es el 31 de enero.

Conclusión

Usar el nuevo Date Time API es muy sencillo y es una grata bienvenida en Java 8; en el cual muchos de sus API ya tienen soporte nativo para Date Time. Hoy en día no deben seguir haciendo uso de los API obsoletos de fecha y hora que tenemos desde Java 1.

Referencias

Autor del Artículo

Gerardo Arroyo Arce

Gerardo Arroyo Arce

Chief Technology Officer.

  • Ingeniero en Software. ITCR.
  • Master en Computación en Informática. UCR.
  • AWS Certified Solutions Architect - Associate
  • Oracle Certified Expert, JEE 6 Web Services Developer.
  • Oracle Certified Professional, Java SE 7 Programmer.
  • Oracle WebLogic Server 12c Certified Implementation Specialist.