Solucionado (ver solução)

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!

Solucionado
(ver solução)
1
resposta

Desafio

O desafio se consiste em trazer a diferença entre a data de compra e do pagamento, levando em conta os meses, dias e anos, certo? Se sim, eu fiz dessa forma.

package com.github.lucasdevrj.principal;

import java.time.*;
import java.time.format.DateTimeFormatter;

public class Principal {
    public static void main(String[] args) {
        LocalDate dataDaCompra = LocalDate.now();
        LocalDate dataDoRecebimentoDoSalario = LocalDate.of(2026, 5, 5);
        LocalDate dataDaPrimeiraParcela = LocalDate.of(2026, 5, 28);
        LocalDate dataDaSegundaParcela = dataDaPrimeiraParcela.plusDays(30);

        System.out.println("Data da compra: " + dataDaCompra);
        System.out.println("Data da primeira parcela: " + dataDaPrimeiraParcela);
        System.out.println("Data da segunda parcela: " + dataDaSegundaParcela);

        if (dataDaPrimeiraParcela.isEqual(dataDaCompra)) {
            System.out.println("A parcela esta vencendo hoje.");
        }

        if (dataDoRecebimentoDoSalario.isBefore(dataDaPrimeiraParcela)) {
            System.out.println("Recebe salário antes da primeira fatura.");
        }

        DateTimeFormatter formatadorDeData = DateTimeFormatter.ofPattern("dd/MM/yyyy");

        System.out.println("Data da compra formatada: " + dataDaCompra.format(formatadorDeData));

        ZonedDateTime dataDeOutraCompra = ZonedDateTime.now();
        System.out.println("Data de outra compra: " + dataDeOutraCompra);
        ZonedDateTime dataDeOutraCompraNY = dataDeOutraCompra.withZoneSameInstant(ZoneId.of("America/New_York"));
        System.out.println("Data de outra compra em New York: " + dataDeOutraCompraNY);

        LocalTime inicioDoExpediente = LocalTime.of(9, 0);
        LocalTime fimDoExpediente = LocalTime.of(17, 30);
        Duration duracaoDoExpediente = Duration.between(inicioDoExpediente, fimDoExpediente);
        System.out.println("Duração do Expediente: " + duracaoDoExpediente.toHours() + " horas e "
                + duracaoDoExpediente.toMinutesPart() + " minutos.");

        LocalDate dataDoPagamento = LocalDate.parse("2026-10-30");
        Period periodo = Period.between(dataDaCompra, dataDoPagamento);
        int duracaoMesesParaDias = periodo.getMonths() * 30;
        int duracaoDiasParaAno = periodo.getYears() * 356;
        int duracaoDias = periodo.getDays();
        int duracaoTotalEmDias = duracaoMesesParaDias + duracaoDiasParaAno + duracaoDias;

        System.out.println("Diferença da data de compra e pagamento: " + duracaoTotalEmDias + " dias.");
    }
}

Eu sei que nem todos os meses tem 30 dias, mas isso foi uma forma de "arredondar".

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

Esta certo?

1 resposta
solução!

Olá, Lucas. Como vai?

Parabéns pelo código e pela excelente exploração do pacote java.time! A sua lógica de usar a classe Period e fazer a conversão manual multiplicando os meses por 30 faz sentido matematicamente para criar uma estimativa aproximada, e o seu código rodou perfeitamente (chegando aos 150 dias que aparecem no seu print).

No entanto, para responder à sua pergunta: na programação diária com Java, não precisamos fazer esse cálculo manual ("arredondando" meses e anos). O pacote java.time foi criado justamente para resolver o problema dos meses com 28, 30 ou 31 dias e dos anos bissextos de forma automática. Trago duas dicas de ouro para o seu código:

1. Cuidado com o erro de digitação (Typo)

Na sua linha de conversão de anos, você digitou 356 dias em vez de 365:

// Como está no seu código:
int duracaoDiasParaAno = periodo.getYears() * 356; 

// O correto seria:
int duracaoDiasParaAno = periodo.getYears() * 365; 

2. A forma definitiva de contar dias: ChronoUnit

Se o seu objetivo final é saber o total exato de dias entre duas datas, a classe Period não é a ferramenta mais indicada. O Java possui um enumerador chamado ChronoUnit que faz esse cálculo absoluto para você em uma única linha.

Veja como você pode refatorar e simplificar a última parte do seu código:

// Importe a classe no topo do arquivo
import java.time.temporal.ChronoUnit;

// ... (resto do seu código) ...

LocalDate dataDoPagamento = LocalDate.parse("2026-10-30");

// Usa o ChronoUnit para calcular a diferença exata em dias corridos
long duracaoTotalEmDias = ChronoUnit.DAYS.between(dataDaCompra, dataDoPagamento);

System.out.println("Diferença exata entre compra e pagamento: " + duracaoTotalEmDias + " dias.");

Quando usar o Period então?
O Period é perfeito para quando você quer exibir a diferença separada por blocos de tempo literais (sem somar tudo). Por exemplo, se você quisesse exibir a mensagem: "Faltam 0 anos, 4 meses e 30 dias para o pagamento".

Você fez um excelente trabalho explorando as classes LocalDate, ZonedDateTime e formatadores. Continue assim!