======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