Skip to content

3 Fechas

Introducción

Para poder trabajar con fechas, en Java se usa la clase LocalDate, la cuál solo maneja la fecha (no la hora), a diferencia de la clase Date del paquete java.util.

Para poder crear una instancia de dicha clase, esta API nos proporciona los siguientes métodos estáticos:

  • now(): Obtiene la fecha actual.
  • of(): Recibe tres parámetros, el año, el mes (1 al 12) y el día, respectivamente de tipo entero. Existe una versión sobrecargada, que en lugar de recibir el mes como un entero lo recibe como tipo enum Month. Si algún dato no es correcto, por ejemplo, se específica un mes erróneo, o un día del mes incorrecto, se lanzará la excepción DateTimeException.
  • ofEpochDay(): Recibe un parámetro de tipo long y crea una fecha a partir de milisegundos, partiendo desde el 01 de Enero de 1970.
  • ofYearDay(): Recibe dos parámetros, el año y el día del año de tipo entero. Creará la fecha a partir de ambos datos.
LocalDate today = LocalDate.now();
LocalDate date1 = LocalDate.of(2022, 5, 24); // 24 de Mayo de 2022
LocalDate date2 = LocalDate.of(2022, Month.MAY; 24);
LocalDate date3 = LocalDate.of(2022, 2, 30); // DateTimeException
LocalDate date4 = LocalDate.ofEpochDay(19527); // 2023-06-19
LocalDate date5 = LocalDate.ofYearDay(2023, 115); // 2023-04-25

Algunos métodos importantes para trabajar con fechas:

  • getDayOfMonth(). Devuelve el día del mes de la fecha indicada.
  • getDayOfWeek(). Devuelve una instancia del enum DayOfWeek con el día de la semana.
  • getDayOfYear(). Devuelve el día del año.
  • getMonth(). Devuelve una instancia del enum Month con el mes al cual pertenece la fecha.
  • getMontValue(). Devuelve un número entero (1-12) representativo del mes.
  • getYear(). Devuelve el año de una fecha.
  • isLeapYear(). Comprueba si la instancia fecha es un año bisiesto.
  • lengthOfMonth(). Devuelve el número de días que tiene el mes.
  • lengthOfYear(). Devuelve el número de días que tiene el año.

Además de estos métodos, también posee métodos para añadir días (plusDays()), meses (plusMonths()), semanas (plusWeeks()) y años (plusYears()), y los mismos para restar(minusDays(), minusMOnths(), minusWeeks(), minusYears(), minusDays())

Veamos un ejemplo:

public class LocalDateExample {
    public void show(){
        LocalDate date = LocalDate.now();
        infoDate(date);

        LocalDate datePlusTenDays = date.plusDays(10);
        infoDate(datePlusTenDays);

        LocalDate datePlusTwoMonths = date.plusMonths(2);
        infoDate(datePlusTwoMonths);

        LocalDate dateMinusOneYear = date.minusYears(1);
        infoDate(dateMinusOneYear);
    }

    private void infoDate(LocalDate date) {
        System.out.printf("La fecha es: %s\n- Día de la semana: %s\n- Mes: %s\n- Año: %d\n- ¿Es año bisiesto?: %s\n",
                date, date.getDayOfWeek(), date.getMonth(), date.getYear(), date.isLeapYear() ? "Sí" : "No");
    }

    public static void main(String[] args) {
        new LocalDateExample().show();
    }
}

YearMonth

Es una clase que representa el mes especifico de un año. Se puede instanciar haciendo uso de los métodos estáticos now() y of(year, month), siendo month un entero o un tipo enum Month.

Con el método lengthOfMonth() obtenemos el número de días que tiene ese mes en ese año.

YearMonth year = YearMonth.of(2022, 12); 
System.out.println(year.lengthOfMonth()); // 31

Tiene métodos parecidos a los vistos en el punto anterior, para añadir y restar meses y años y para saber si el año es bisiesto. Además tiene lo siguientes métodos:

  • isAfter(YearMonth other): Comprueba si la fecha instanciada es posterior a other.
  • isBefore(YearMonth other): Comprueba si la fecha instanciada es anterior a other.
  • isValidDay(int day): Comprueba si el día especificado es un día válido dentro de ese mes y año. Por ejemplo, el día 29 sí sería un día válido para el mes Marzo del 2023 pero no sería válido para el 29 de Febrero de 2023.
  • withMoth(). Devuelve una copia del año y del mes, pero con el mes alterado.
  • withYear(). Devuelve una copia del año y del mes, pero con el año alterado.
  • atDay(int day). Devuelve un objeto de tipo LocalDate con el día especificado, pudiendo lanzar un DateTimeException si el día no es válido para ese mes y ese año.
  • atEndOfMonth: Devuelve un objeto de tipo LocalDatecon el día en el final del mes.

Veamos un ejemplo haciendo uso de estos métodos:

public class YearMonthExample {
    public void show(){
        YearMonth ym1 = YearMonth.now();
        YearMonth ym2 = YearMonth.of(2023, 5);
        YearMonth ym3 = ym1.withMonth(10);

        System.out.println(ym1.isAfter(ym2));
        System.out.println(ym1.isValidDay(31));
        System.out.println(ym3.atDay(10));
        System.out.println(ym3.atEndOfMonth());
    }

    public static void main(String[] args) {
        new YearMonthExample().show();
    }
}

MonthDay

La clase MonthDay representa un día de un mes en particular. Para construir una objeto de dicha clase tenemos los siguientes métodos estáticos:

  • of(int month, int day): Recibe el mes y el día del mes de los cuales se quiere construir el objeto. Tiene un versión sobrecargada, que en vez de recibir el mes en formato entero lo recibe como un enum Month.
  • now(): Crea una instancia de la clase con el mes y el día actual.

La mayoría de métodos son parecidos a los vistos anteriormente, pero además añade:

  • isValidYear(). Comprueba si ese día en ese mes concreto es válido para cierto año. Por ejemplo, si pasamos como parámetro 2023, y validamos si es correcto el 29 de Febrero, retornaría false, como dicho día en dicho mes y en dicho año, el mes de Febrero no tiene 29 días.
  • atYear(): Crea una instancia de la clase LocalDate con el año indicado. Si la fecha no es válida, lanzará una excepción de tipo DateTimeException.

Veamos un ejemplo:

public class MonthDayExample {
    public void show(){
        MonthDay md1 = MonthDay.now();
        MonthDay md2 = md1.withDayOfMonth(20);

        System.out.println(md1.isBefore(md2));
        System.out.println(MonthDay.of(2, 29).isValidYear(2024));
        System.out.println(md1.atYear(2020));
    }

    public static void main(String[] args) {
        new MonthDayExample().show();
    }
}

Year

La clase Year nos permite obtener información de un año especifico sin importar ni el día ni el mes. Para construir un objeto de dicha clase se usa los siguientes métodos estáticos:

  • now(). Crea una instancia con el año actual.
  • of(int year): Crea una instancia con el año indicado.

Alguno de sus métodos son:

  • atDay(int dayOfYear): Devuelve un LocalDate con el día y el mes obtenido del dayOfYear.
  • atMonth(int month): Devuelve un YearMonth con el mes indicado. Tiene una versión sobrecargada que recibe una instancia del enum Month.
  • athMonthDay(MonthDay monthDay): Devuelve un LocalDate con el día y el mes indicados.
  • getValue(). Retorna el valor entero del año.
  • isLeap(). Comprueba si el año es bisiesto. Además tiene una versión estática isLeap(int year) para comprobar si el año indicado es bisiesto sin necesidad de crear una instancia de la clase Year.
  • length(). Devuelve el número de días que tiene ese año.

Además tiene métodos similares a las clases anteriores. Veamos un ejemplo:

public class YearExample {
    public void show(){
        Year year1 = Year.now();
        Year year2 = Year.of(2023);

        System.out.println(year1.isAfter(year2));
        System.out.println(year1.atDay(123));
        System.out.println(year1.atMonth(Month.APRIL));
        System.out.println("Año en entero: " + year1.getValue());
        System.out.println("Número de días: " + year1.length());
        System.out.println(Year.isLeap(2024));
    }

    public static void main(String[] args) {
        new YearExample().show();
    }
}