1
resposta

[Projeto] Eu fiz de forma diferente

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

/**
 * Classe responsável por controlar o expediente de um usuário,
 * calculando o saldo de horas com base no horário de entrada,
 * carga horária diária e horário de saída.
 *
 * O sistema informa se o usuário possui:
 * - Horas extras (+)
 * - Débito de horas (-)
 * - Saldo zerado (0)
 */
public class ControleExpediente {

    public static void main(String[] args) {

        // Scanner para leitura de dados do usuário
        Scanner scanner = new Scanner(System.in);

        // Formato padrão de horário (HH:mm)
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");

        // =========================
        // Entrada de dados
        // =========================

        System.out.print("Digite o horário de entrada (HH:mm): ");
        LocalTime entrada = LocalTime.parse(scanner.next(), formatter);

        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: ");
        LocalTime fim = LocalTime.parse(scanner.next(), formatter);

        // =========================
        // Regra de negócio
        // =========================

        // Calcula o horário esperado de saída
        LocalTime saidaPrevista = entrada.plusHours(cargaHoraria);

        /*
         * Verifica o saldo de horas:
         * - Se saiu depois → hora extra (+)
         * - Se saiu antes → débito (-)
         * - Se saiu no horário → saldo zero (0)
         */
        if (fim.isAfter(saidaPrevista)) {
            String saldoFormatado = formatarSaldo(entrada, saidaPrevista, fim, "+");
            System.out.println(saldoFormatado);

        } else if (fim.isBefore(saidaPrevista)) {
            String saldoFormatado = formatarSaldo(entrada, saidaPrevista, fim, "-");
            System.out.println(saldoFormatado);

        } else {
            String saldoFormatado = formatarSaldo(entrada, saidaPrevista, fim, "0");
            System.out.println(saldoFormatado);
        }
    }

    /**
     * Calcula e formata o saldo de horas do usuário.
     *
     * @param entrada         Horário de entrada
     * @param saidaPrevista   Horário esperado de saída (entrada + carga horária)
     * @param fim             Horário real de saída
     * @param sinal           Indica o tipo de saldo:
     *                        "+" para hora extra
     *                        "-" para débito
     *                        "0" para saldo zerado
     *
     * @return String formatada com resumo do expediente e saldo de horas
     */
    public static String formatarSaldo(LocalTime entrada, LocalTime saidaPrevista, LocalTime fim, String sinal) {

        // Calcula a diferença entre saída prevista e saída real
        Duration banco = Duration.between(saidaPrevista, fim);

        long horas = banco.toHours();
        int minutos = banco.toMinutesPart();

        String saldoHoras;

        // Define o formato do saldo
        if (sinal.equals("0")) {
            saldoHoras = "0h 0min";
        } else {
            saldoHoras = sinal + Math.abs(horas) + "h " + Math.abs(minutos) + "min";
        }

        // Retorna mensagem final formatada
        return String.format(
                "Horário de entrada: " + entrada +
                        "%nHorário de saída previsto: " + saidaPrevista +
                        "%nHorário de saída: " + fim +
                        "%nSaldo de horas: " + saldoHoras
        );
    }
}
1 resposta

Olá, Lucas, como vai?

Seu código apresenta uma implementação muito organizada e modular, utilizando corretamente as classes do pacote java.time para lidar com cálculos de períodos. O uso de métodos auxiliares como o formatarSaldo demonstra uma boa preocupação com a reutilização de código e clareza da lógica principal. É interessante notar como você explorou o método toMinutesPart da classe Duration, que facilita a separação das unidades de tempo sem a necessidade de cálculos manuais de resto de divisão.

Parabéns por desenvolver uma solução personalizada e funcional, continue compartilhando suas evoluções conosco. O fórum está à disposição para qualquer dúvida que surgir.

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