======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.
^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 [[https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html|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);
----
(c) {{date> %Y}} Fernando Valdeón