Java LocalDate com o Método withMonth

JavaBeginner
Pratique Agora

Introdução

A classe LocalDate em Java 8 oferece múltiplos métodos para manipular valores de data. Um desses métodos é withMonth(), que retorna uma nova instância de LocalDate após alterar ou definir o mês do ano.

Criando uma instância LocalDate

O primeiro passo é criar uma instância de LocalDate em Java. A classe LocalDate está localizada no pacote java.time, então incluiremos o pacote no início do nosso arquivo de código. A classe LocalDate fornece um método of() que pode criar uma nova instância de LocalDate.

import java.time.LocalDate;

public class LocalDateWithMonthMethodExample {
    public static void main(String[] args) {
        // criando uma nova instância de LocalDate
        LocalDate date = LocalDate.of(2022, 10, 12);

        // imprimindo a data original
        System.out.println("Original Date: " + date);
    }
}

Use o seguinte comando para compilar e executar o código no terminal:

javac LocalDateWithMonthMethodExample.java && java LocalDateWithMonthMethodExample

Usando o método withMonth()

O método withMonth() retorna uma nova instância de LocalDate com o mês do ano definido para o valor fornecido como argumento.

Podemos definir um mês do ano diferente usando o método withMonth() e obter uma data recém-criada. Aqui, estamos definindo o mês do ano para 4 e obtendo a nova data.

// definindo o mês do ano para 4 e obtendo a nova data
LocalDate newDate = date.withMonth(4);

// imprimindo a nova data
System.out.println("New Date: " + newDate);

Aqui está o código completo:

import java.time.LocalDate;

public class LocalDateWithMonthMethodExample {
    public static void main(String[] args) {
        // criando uma nova instância de LocalDate
        LocalDate date = LocalDate.of(2022, 10, 12);

        // imprimindo a data original
        System.out.println("Original Date: " + date);

        // definindo o mês do ano para 4 e obtendo a nova data
        LocalDate newDate = date.withMonth(4);

        // imprimindo a nova data
        System.out.println("New Date: " + newDate);
    }
}

Use o seguinte comando para compilar e executar o código no terminal:

javac LocalDateWithMonthMethodExample.java && java LocalDateWithMonthMethodExample

Você deve ver a seguinte saída:

Original Date: 2022-10-12
New Date: 2022-04-12

Tratando valores de mês inválidos

Se o valor do mês passado para o método withMonth() for inválido, ou seja, estiver fora do intervalo [1, 12], ele lançará uma DateTimeException.

Aqui está um exemplo que demonstra como você pode lidar com um valor de mês inválido.

import java.time.DateTimeException;
import java.time.LocalDate;

public class LocalDateWithMonthMethodExample {
    public static void main(String[] args) {
        // criando uma nova instância de LocalDate
        LocalDate date = LocalDate.of(2022, 10, 12);

        // imprimindo a data original
        System.out.println("Original Date: " + date);

        try {
            // tentando definir um valor de mês inválido (13)
            LocalDate newDate = date.withMonth(13);

            // imprimindo a nova data
            System.out.println("New Date: " + newDate);
        } catch(DateTimeException ex) {
            System.out.println("Invalid month value provided: " + ex.getMessage());
        }
    }
}

Use o seguinte comando para compilar e executar o código no terminal:

javac LocalDateWithMonthMethodExample.java && java LocalDateWithMonthMethodExample

Você deve ver a seguinte saída:

Original Date: 2022-10-12
Invalid month value provided: Invalid value for MonthOfYear (valid values 1 - 12): 13

Alterando o mês do ano na instância de data original

O método withMonth() retorna uma nova instância de LocalDate com o valor do mês do ano definido para o novo valor, e não altera a instância de data original. Se você deseja alterar o valor do mês do ano na data original, você deve atribuir o valor retornado por withMonth() de volta à instância de data original, assim:

// alterando o mês do ano na instância de data original
date = date.withMonth(11);

// imprimindo a data atualizada
System.out.println("Updated Date: " + date);

Aqui está o código completo:

import java.time.LocalDate;

public class LocalDateWithMonthMethodExample {
    public static void main(String[] args) {
        // criando uma nova instância de LocalDate
        LocalDate date = LocalDate.of(2022, 10, 12);

        // imprimindo a data original
        System.out.println("Original Date: " + date);

        // definindo o mês do ano para 5 e obtendo a nova data
        LocalDate newDate = date.withMonth(5);

        // imprimindo a nova data
        System.out.println("New Date: " + newDate);

        // alterando o mês do ano na instância de data original
        date = date.withMonth(11);

        // imprimindo a data atualizada
        System.out.println("Updated Date: " + date);
    }
}

Use o seguinte comando para compilar e executar o código no terminal:

javac LocalDateWithMonthMethodExample.java && java LocalDateWithMonthMethodExample

Você deve ver a seguinte saída:

Original Date: 2022-10-12
New Date: 2022-05-12
Updated Date: 2022-11-12

Tratamento de um valor de dia inválido

Se o dia do mês for inválido para o ano ao alterar o mês, ele será alterado para o último dia válido do novo mês. Por exemplo, se mudarmos o mês do ano de fevereiro para abril em um ano bissexto, o valor do dia será automaticamente ajustado para o último dia válido de abril.

// criando uma nova instância de LocalDate
LocalDate date = LocalDate.of(2024, 2, 29);

// imprimindo a data original
System.out.println("Original Date: " + date);

// definindo o mês do ano para abril
LocalDate newDate = date.withMonth(4);

// imprimindo a nova data
System.out.println("New Date: " + newDate);

Aqui está o código completo:

import java.time.LocalDate;

public class LocalDateWithMonthMethodExample {
    public static void main(String[] args) {
        // criando uma nova instância de LocalDate
        LocalDate date = LocalDate.of(2024, 2, 29);

        // imprimindo a data original
        System.out.println("Original Date: " + date);

        // definindo o mês do ano para abril
        LocalDate newDate = date.withMonth(4);

        // imprimindo a nova data
        System.out.println("New Date: " + newDate);
    }
}

Use o seguinte comando para compilar e executar o código no terminal:

javac LocalDateWithMonthMethodExample.java && java LocalDateWithMonthMethodExample

Você deve ver a seguinte saída:

Original Date: 2024-02-29
New Date: 2024-04-30

Usando o método withMonth() em um loop

Podemos usar o método withMonth() em um loop para gerar uma lista de datas com diferentes valores de mês do ano. Aqui está um exemplo que gera datas para cada mês do ano de 2022:

// gerando datas para cada mês do ano de 2022
for (int month = 1; month <= 12; month++) {
    LocalDate date = LocalDate.of(2022, month, 1);
    System.out.println("Date for " + date.getMonth() + ": " + date);
}

Aqui está o código completo:

import java.time.LocalDate;

public class LocalDateWithMonthMethodExample {
    public static void main(String[] args) {
        // gerando datas para cada mês do ano de 2022
        for (int month = 1; month <= 12; month++) {
            LocalDate date = LocalDate.of(2022, month, 1);
            System.out.println("Date for " + date.getMonth() + ": " + date);
        }
    }
}

Use o seguinte comando para compilar e executar o código no terminal:

javac LocalDateWithMonthMethodExample.java && java LocalDateWithMonthMethodExample

Você deve ver a seguinte saída:

Date for JANUARY: 2022-01-01
Date for FEBRUARY: 2022-02-01
Date for MARCH: 2022-03-01
Date for APRIL: 2022-04-01
Date for MAY: 2022-05-01
Date for JUNE: 2022-06-01
Date for JULY: 2022-07-01
Date for AUGUST: 2022-08-01
Date for SEPTEMBER: 2022-09-01
Date for OCTOBER: 2022-10-01
Date for NOVEMBER: 2022-11-01
Date for DECEMBER: 2022-12-01

Usando o método getMonthValue()

O método getMonthValue() é usado para obter o valor do mês do ano de uma data. Aqui está um exemplo que demonstra como usar os métodos withMonth() e getMonthValue() para alterar e obter o valor do mês do ano de uma data:

// criando uma nova instância de LocalDate
LocalDate date = LocalDate.of(2022, 11, 15);

// imprimindo a data original
System.out.println("Original Date: " + date);

// obtendo o valor do mês do ano
int originalMonthValue = date.getMonthValue();

// alterando o mês do ano para 10
date = date.withMonth(10);

// obtendo o novo valor do mês do ano
int newMonthValue = date.getMonthValue();

// imprimindo a data atualizada e os valores do mês
System.out.println("Updated Date: " + date);
System.out.println("Original Month Value: " + originalMonthValue);
System.out.println("New Month Value: " + newMonthValue);

Aqui está o código completo:

import java.time.LocalDate;

public class LocalDateWithMonthMethodExample {
    public static void main(String[] args) {
        // criando uma nova instância de LocalDate
        LocalDate date = LocalDate.of(2022, 11, 15);

        // imprimindo a data original
        System.out.println("Original Date: " + date);

        // obtendo o valor do mês do ano
        int originalMonthValue = date.getMonthValue();

        // alterando o mês do ano para 10
        date = date.withMonth(10);

        // obtendo o novo valor do mês do ano
        int newMonthValue = date.getMonthValue();

        // imprimindo a data atualizada e os valores do mês
        System.out.println("Updated Date: " + date);
        System.out.println("Original Month Value: " + originalMonthValue);
        System.out.println("New Month Value: " + newMonthValue);
    }
}

Use o seguinte comando para compilar e executar o código no terminal:

javac LocalDateWithMonthMethodExample.java && java LocalDateWithMonthMethodExample

Você deve ver a seguinte saída:

Original Date: 2022-11-15
Updated Date: 2022-10-15
Original Month Value: 11
New Month Value: 10

Resumo

Neste laboratório, você aprendeu como usar o método withMonth() para criar uma cópia de uma instância LocalDate com o mês do ano definido para um novo valor. Você também aprendeu como lidar com valores de mês inválidos e como usar o método getMonthValue() para obter o valor do mês do ano de uma instância LocalDate. O método withMonth() é uma ferramenta útil para manipular datas e pode ser usado de várias maneiras diferentes, incluindo a geração de uma lista de datas para cada mês do ano.