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

Esse me deu bastante trabalho, fiquei tentando por horas, cheguei em um resultado que não estava certo, mas pedindo ajuda ao Claud, consegui chegar no resultado e entender o meu erro. Tinha que converter tudo para minutos, para assim fazer os calculos.

/**
 * Você trabalha no setor administrativo de uma empresa e precisa de um sistema para acompanhar
 * os horários de entrada e saída dos funcionários. O sistema deve calcular o horário de saída
 * com base na hora de entrada e na carga horária diária.
 *
 * Além disso, para controle de banco de horas, o sistema deve calcular quantas horas um funcionário
 * trabalhou a mais ou a menos, caso o expediente tenha durado mais ou menos que o previsto.
 *
 * O programa deve:
 *
 * Capturar o horário de entrada.
 * Adicionar a carga horária diária para calcular o horário de saída previsto.
 * Capturar o horário real de saída
 * Calcular a diferença entre o tempo trabalhado e a carga horária.
 * Exibir as informações formatadas corretamente.
 */

package com.github.lucasdevrj.exercicios;

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Scanner;

public class ControleDoExpediente {
    public static void main(String[] args) {
        DateTimeFormatter formatoDoHorario = DateTimeFormatter.ofPattern("HH:mm");
        Scanner entrada = new Scanner(System.in);

        // Horário de entrada
        System.out.print("Digite o horário de entrada (Ex: HH:mm): ");
        LocalTime horarioDeEntrada = LocalTime.parse(entrada.next(), formatoDoHorario);

        // Carga horária
        int cargaHoraria;
        do {
            System.out.print("Digite a carga horária diária em horas: ");
            cargaHoraria = entrada.nextInt();
            if (cargaHoraria < 4) {
                System.out.println("Digite uma carga horária maior ou igual a 4 horas.");
            }
        } while (cargaHoraria < 4);

        // Horário de saída
        LocalTime horarioDeSaida;
        do {
            System.out.print("Digite o horário de saída (Ex: HH:mm): ");
            horarioDeSaida = LocalTime.parse(entrada.next(), formatoDoHorario);
            if (!horarioDeSaida.isAfter(horarioDeEntrada)) {
                System.out.println("Horário de saída tem que ser posterior ao de entrada.");
            }
        } while (!horarioDeSaida.isAfter(horarioDeEntrada));

        entrada.close();

        // Saída prevista
        LocalTime horarioDeSaidaPrevisto = horarioDeEntrada.plusHours(cargaHoraria);

        // ✅ Saldo em minutos
        long minutesTrabalhados = ChronoUnit.MINUTES.between(horarioDeEntrada, horarioDeSaida);
        long minutesEsperados   = cargaHoraria * 60L;
        long saldoTotalMinutos  = minutesTrabalhados - minutesEsperados;

        long saldoHoras   = saldoTotalMinutos / 60;
        long saldoMinutos = Math.abs(saldoTotalMinutos % 60);

        // Formatando saldo
        String sinal = saldoTotalMinutos >= 0 ? "+" : "-";
        String saldoFormatado = "%s%dh %dmin".formatted(sinal, Math.abs(saldoHoras), saldoMinutos);

        // Resultado
        String resultado = """
                Horário de entrada       : %s
                Horário de saída previsto: %s
                Horário real de saída    : %s
                Saldo de horas           : %s
                """.formatted(
                horarioDeEntrada.format(formatoDoHorario),
                horarioDeSaidaPrevisto.format(formatoDoHorario),
                horarioDeSaida.format(formatoDoHorario),
                saldoFormatado
        );

        System.out.println(resultado);
    }
}
1 resposta

Oi, Lucas, como vai?

Obrigado por compartilhar sua solução e também o raciocínio que levou até ela. Seu código atende aos requisitos da atividade e a abordagem de converter os horários para minutos antes de calcular o saldo foi uma boa escolha, pois simplifica o tratamento das diferenças de tempo.

Além disso, você utilizou adequadamente recursos da API de data e hora do Java, como LocalTime, DateTimeFormatter e ChronoUnit.MINUTES.between(). As validações para carga horária e horário de saída também agregam robustez ao programa, mesmo não sendo exigidas diretamente pelo exercício.

Pensando em uma evolução desse projeto, como você trataria casos em que o funcionário inicia o expediente em um dia e encerra após a meia-noite?

Parabéns pela resolução e pela persistência durante o processo. Continue compartilhando suas soluções, o fórum está à disposição para acompanhar sua evolução.

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