Herramientas de usuario

Herramientas del sitio


bloque3:fechas

Fechas y horas

paquete java.time

Con la versión 8 de Java (2014) se incluyó un nuevo paquete con un conjunto de clases que facilitan el trabajo con fechas y horas.

Estas nuevas clases sustituyen a las viejas clases Date, Calendar, Gregorian Calendar, etc.

Las nuevas clases LocalDate, LocalTime y LocalDateTime tienen métodos comunes que funcionan del mismo modo.

Clase LocalDate

Se usa para almacenar fechas sin atender a la zona horaria. Se compone de 3 enteros: días, meses y años. Tiene una gran cantidad de métodos estáticos.

Hay que tener en cuenta que estas clases almacenan un elemento inmutable (una fecha fija). Si quiero modificar su valor, debo cambiarlo a través de sus métodos y guardar el nuevo objeto.

Instanciar LocalDate

Para crear un objeto de tipo LocalDate puedo utilizar alguno de sus método estáticos. LocalDate no tiene constructor, y solo se pueden crear objetos a través de sus métodos estáticos.

//Obtener la fecha de hoy (basada en el reloj del Sistema)
 
LocalDate fechaActual = LocalDate.now();
 
//Obtener una fecha cualquiera
LocalDate fecha = LocalDate.of(2018, 3, 23); 
//Almacena la fecha de 23-3-2018
 
//Para obtener una fecha a partir de un String (formato "aaaa-mm-dd")
LocalDate fecha = LocalDate.parse("2007-12-03");

Métodos de instancia

LocalDate fechaActual = LocalDate.now();

  • fechaActual.toString() : Obtengo un String con la fecha
  • fechaActual.compareTo(fecha) : Compara 2 fechas: devuelve int negativo si fechaActual es anterior, positivo si es posterior, 0 si es igual
  • fechaActual.isBefore(fecha) : Indica si una fecha es anterior a otra. true si fechaActual es anterior a fecha
  • fechaActual.isAfter(fecha) : Indica si una fecha es posterior a otra. true si fechaActual es posterior a fecha
  • fechaActual.getYear() : Devuelve un int con el año
  • fechaActual.getMonthValue() : Devuelve un int con el mes (1-12)
  • fechaActual.getDayOfMonth() : Devuelve un int con el día del mes
  • fechaActual.getDayOfWeek() : Devuelve un int con el día de la semana (1-7)
  • fechaActual = fechaActual.minusDays(30) : Devuelve la fecha contenida restándole 30 días
  • fechaActual.minusMonths(4) : Devuelve la fecha contenida restándole 4 meses.
  • fechaActual.minusYears(5) : Devuelve la fecha contenida restándole 5 años.
  • fechaActual.plusDays(30) : Devuelve la fecha contenida sumándole 30 días.
  • fechaActual.plusMonths(4) : Devuelve la fecha contenida sumándole 4 meses.
  • fechaActual.plusYears(5) : Devuelve la fecha contenida sumándole 5 años.
  • fechaActual.withDayOfMonth(7) : Devuelve la fecha contenida, cambiando el día a 7
  • fechaActual.withMonth(3) : Devuelve la fecha contenida, cambiando el mes a 3
  • fechaActual.withYear(2015) : Devuelve la fecha contenida, cambiando el año a 2015

Recordar que el objeto LocalDate no cambia nunca (es inmutable), por lo que el nuevo objeto generado hay que guardarlo en una variable:

fechaActual = fechaActual.plusDays(234);

Clase Period

Podemos usar esta clase simplemente para calcular el tiempo que pasa entre 2 fechas LocalDate. Es útil para calcular edades de forma correcta.

LocalDate fecha1 = LocalDate.now();
LocalDate fecha2 = LocalDate.parse("2000-04-01");
 
Period diferencia = Period.between(fecha2, fecha1);
 
//Muestra los días de diferencia
System.out.println(diferencia.getDays());
 
//Muestra los meses de diferencia
System.out.println(diferencia.getMonths());
 
//Muestra los años de diferencia
System.out.println(diferencia.getYears());

Clase LocalDateTime

Esta clase funciona igual que la clase LocalDate. La diferencia es que guarda una fecha y una hora.

  • Obtener fecha y hora actual:

LocalDateTime fechaHora = LocalDateTime.now()

  • Crear una fecha con hora concreta (25-7-2016 22:11:30)

LocalDateTime dateTime = LocalDateTime.of(2016, 7, 25, 22, 11, 30)

  • Modificar una fecha
LocalDateTime dateTime = LocalDateTime.of(2016, 7, 25, 22, 11, 30);
LocalDateTime dateTime1 = dateTime.withYear(2017);
LocalDateTime dateTime2 = dateTime.withMonth(8);
LocalDateTime dateTime3 = dateTime.withDayOfMonth(27);
LocalDateTime dateTime4 = dateTime.withHour(20);
LocalDateTime dateTime5 = dateTime.withMinute(25);
LocalDateTime dateTime6 = dateTime.withSecond(23);
LocalDateTime dateTime7 = dateTime.withNano(24);

Clase LocalTime

Funciona igual que las anteriores pero solo almacena una hora.

//Hora actual
LocalTime horaActual = LocalTime.now();
 
//Almacenar una hora cualquiera (15:45:59)
LocalTime hora = LocalTime.of(15, 45, 59);
 
//Almacenar una hora a partir de un String
LocalTime hora = LocalTime.parse("23:12:59");
 
//Siempre en formato hh-mm-ss

Métodos de instancia

getMinute(), getSecond(), getHour(), minusHours(), plusHours(), minusMinutes(), plusMinutes(), minusSeconds(), plusSeconds(), withHour(), withMinute(), etc.

LocalTime time = LocalTime.of(14, 30, 35); //14:30:35
LocalTime time1 = time.withHour(20); //20:30:35
LocalTime time2 = time.withMinute(25); //14:25:35
LocalTime time3 = time.withSecond(23); //14:30:23
LocalTime time4 = time.withNano(24); //14:30:35.000000024
LocalTime time5 = time.with(ChronoField.HOUR_OF_DAY, 23); //23:30:35

Clase DateTimeFormatter

Mediante esta clase podemos mostrar o leer fechas y horas en el formato que deseamos. Por ejemplo, 23/7/2017 para una fecha o 1-27-45 para una hora.

Para dar formato a las fechas tenemos algunos comodines para representar cada valor (dias, meses, años, etc. Veamos cuales son los más importantes.

CaracterValor que representa
y, uaño en formato de cuatro o dos dígitos (2014 o 14)
dnúmero del día del mes en cuestión (27)
Mmes del año en forma numérica (01-12)
Dnúmero de día del año (225)
Lmes del año en texto
Hhora
mminutos
ssegundos
a periodo del día (am, pm)

De esto modo podemos crear patrones del tipo:

dd/MM-yyyy → fecha formato dd/mm/aaaa

En la API de Java de la clase DateTimeFormatter se pueden ver todos los formatos.

Uso de DateTimeFormatter

Crear un DateTimeFormatter, aplicádole un patrón distinto:

DateTimeFormatter formateador = DateTimeFormatter.ofPattern("d/M/y");

Obtener la fecha de hoy:

LocalDate fecha = LocalDate.now()

Mostrar la fecha de hoy, con el formato establecido en el DateTimeFormatter:

//Muestra la fecha en formato día/mes/año
System.out.println(fecha.format(formateador));
System.out.println(formateador.format(fecha));

Mostrar o almacenar una fecha obtenida en un formato distinto:

System.out.println(LocalDate.parse("3/12/2015", formateador));
 
fecha = fecha.parse(3/12/2015”, formateador); 

© 2020 Fernando Valdeón

bloque3/fechas.txt · Última modificación: 04/02/2020 18:48 por Fernando Valdeón