Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

Resolução

/**
 * Você trabalha no setor financeiro de uma empresa e precisa garantir que as contas sejam
 * pagas antes do vencimento. Para isso, o sistema deve calcular a data exata em que um
 * lembrete de pagamento deve ser disparado com base no prazo de antecedência definido.
 *
 * Por exemplo, se uma conta vence no dia 20 de um mês e os lembretes devem ser enviados
 * 10 dias antes, a notificação deve ser disparada no dia 10. Já se o vencimento for 30
 * de março de 2025 e a antecedência for de 5 dias, o lembrete deverá ser enviado no dia
 * 25 de março de 2025.
 *
 * Crie um programa que, a partir de uma data de vencimento e um período de antecedência em dias,
 * calcule e exiba a data que o lembrete para pagamento deve ser disparado.
 *
 * Saída esperada:
 *
 * Se a data de vencimento for 30 de março de 2025 e o período de antecedência for 5 dias, a saída deve ser:
 * Data do lembrete: 25-03-2025
 */

package com.github.lucasdevrj.exercicios;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;

public class LembreteDePagamento {
    public static void main(String[] args) {
        LocalDate dataDeVencimento;
        LocalDate dataDoLembrete;
        String dataDeVencimentoDigitada = "";
        int diasDeAntecedencia = 0;

        Scanner entrada = new Scanner(System.in);

        System.out.print("Digite a data de vencimento: ");
        dataDeVencimentoDigitada = entrada.nextLine();

        while (!dataDeVencimentoDigitada.matches("\\d{2}/\\d{2}/\\d{4}")) {
            System.out.println("Digite uma data válida. Exemplo: 10/03/2026.");
            System.out.print("Digite a data de vencimento: ");
            dataDeVencimentoDigitada = entrada.nextLine();
        }

        System.out.print("Digite o período de antecedencia em dias: ");
        diasDeAntecedencia = entrada.nextInt();

        while (diasDeAntecedencia <= 0) {
            System.out.println("Digite um período de antecedencia válido. Exemplo: 5");
            System.out.print("Digite o período de antecedencia em dias: ");
            diasDeAntecedencia = entrada.nextInt();
        }

        entrada.close();

        String[] data = dataDeVencimentoDigitada.split("/");
        int dia = Integer.parseInt(data[0]);
        int mes = Integer.parseInt(data[1]);
        int ano = Integer.parseInt(data[2]);
        dataDeVencimento = LocalDate.of(ano, mes, dia);
        dataDoLembrete = LocalDate.of(ano, mes, dia);

        dataDoLembrete = dataDoLembrete.minusDays(diasDeAntecedencia);

        DateTimeFormatter formatoDaData = DateTimeFormatter.ofPattern("dd-MM-yyyy");

        System.out.println("Data do lembrete: " + dataDoLembrete.format(formatoDaData));
    }
}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade
Beleza?

1 resposta

Oi, Lucas, como vai?

Sua solução atende ao objetivo da atividade e demonstra um cuidado adicional com a validação dos dados informados pelo usuário. O cálculo da data do lembrete utilizando minusDays() está correto, assim como a formatação da saída com DateTimeFormatter.

Uma observação é que a validação por expressão regular garante o formato da data, mas não impede datas inexistentes, como 31/02/2025. Nesses casos, o LocalDate.of() lançará uma exceção. Como evolução do exercício, você poderia tratar essa situação utilizando um bloco try-catch ou trabalhar com o método LocalDate.parse() junto a um formatador.

Como você adaptaria a validação para garantir não apenas o formato, mas também a existência da data informada?

Parabéns pela resolução e pela preocupação com a entrada de dados. Continue compartilhando suas soluções. O fórum está à disposição para apoiar seu aprendizado.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!