Tabla de Contenidos
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 fechafechaActual.compareTo(fecha)
: Compara 2 fechas: devuelve int negativo si fechaActual es anterior, positivo si es posterior, 0 si es igualfechaActual.isBefore(fecha)
: Indica si una fecha es anterior a otra.true
si fechaActual es anterior a fechafechaActual.isAfter(fecha)
: Indica si una fecha es posterior a otra.true
si fechaActual es posterior a fechafechaActual.getYear()
: Devuelve un int con el añofechaActual.getMonthValue()
: Devuelve un int con el mes (1-12)fechaActual.getDayOfMonth()
: Devuelve un int con el día del mesfechaActual.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íasfechaActual.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 7fechaActual.withMonth(3)
: Devuelve la fecha contenida, cambiando el mes a 3fechaActual.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.
Caracter | Valor que representa |
---|---|
y, u | año en formato de cuatro o dos dígitos (2014 o 14) |
d | número del día del mes en cuestión (27) |
M | mes del año en forma numérica (01-12) |
D | número de día del año (225) |
L | mes del año en texto |
H | hora |
m | minutos |
s | segundos |
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);
© 2024 Fernando Valdeón