1
resposta

[Projeto] Controle de Expediente - utilizando os métodos isPositive() e isNegative() para validar hora extra

package br.com.java.basico.datahora;

import java.time.Duration;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;

public class Exercicio10 {
    static void main() {
        Scanner scanner = new Scanner(System.in);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");

        // entrada de horários
        System.out.print("Digite o horário de entrada (HH:mm): ");
        LocalTime entrada = LocalTime.parse(scanner.next(), formatter); //converter string em hora formatada

        System.out.print("Digite a carga horária diária (em horas): ");
        int cargaHoraria = scanner.nextInt();

        System.out.print("Digite o horário de saída (HH:mm): ");
        LocalTime saidaReal = LocalTime.parse(scanner.next(), formatter); //converter string em hora formatada

        // calculando horários
        LocalTime saidaPrevista = entrada.plusHours(cargaHoraria);

        Duration horaExtra = Duration.between(saidaPrevista, saidaReal);

        // formatar horários
        String entradaFormatada = entrada.format(formatter);
        String saidaPrevistaFormatada = saidaPrevista.format(formatter);
        String saidaRealFormatada = saidaReal.format(formatter);

        System.out.println("Horário de entrada: " + entradaFormatada);
        System.out.println("Horário de saída previsto: " + saidaPrevistaFormatada);
        System.out.println("Horário de saída: " + saidaRealFormatada);

        // validação das horas extras
        if (horaExtra.isPositive()) {
            System.out.println("Saldo de horas: +" + horaExtra.toHours() + "h " + horaExtra.toMinutesPart() + "min");
        } else if (horaExtra.isNegative()) {
            System.out.println("Saldo de horas: " + horaExtra.toHours() + "h " + horaExtra.toMinutesPart() + "min");
        } else {
            System.out.println("Não tem hora extra.");
        }
    }
}
1 resposta

Oii Isabelle,

Parabéns pela resolução do desafio. A sua abordagem utilizando os métodos .isPositive() e .isNegative() da classe Duration foi excelente.

Essa escolha deixou o seu código muito mais legível e semântico do que fazer comparações manuais (como if (horas > 0)). Isso demonstra que você explorou bem a documentação da API de Data e Hora do Java.

Tenho apenas um ponto de atenção para que seu código fique perfeito e execute sem problemas:

Formatação de minutos negativos
Quando a duração é negativa (banco de horas negativo), o método .toMinutesPart() também retorna o valor com sinal negativo. Isso pode gerar uma saída visualmente estranha, como: Saldo de horas: -1h -30min.
Pra corrigir isso e deixar o visual mais limpo (apenas com um sinal de menos no início ou na hora), você pode usar a classe Math.abs() para remover o sinal da parte dos minutos.

Veja como ficaria esse ajuste no seu else if:

} else if (horaExtra.isNegative()) {
    // Math.abs garante que os minutos apareçam sem o sinal negativo repetido
    System.out.println("Saldo de horas: " + horaExtra.toHours() + "h " + Math.abs(horaExtra.toMinutesPart()) + "min");
}
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!