1
resposta

[Projeto] Controle de Expediente

import java.time.LocalTime;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.println("Digite o horário de entrada (HH:mm): ");
        LocalTime horarioEntrada = RelogioDePonto.formatar(scanner.nextLine());

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

        System.out.println("Digite o horário real de saída (HH:mm): ");
        LocalTime horarioSaida = RelogioDePonto.formatar(scanner.nextLine());
        scanner.close();

        RelogioDePonto.calcularSaldoHoras(horarioEntrada, cargaHoraria, horarioSaida);
    }
}
import java.time.Duration;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class RelogioDePonto {

    static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");

    public static LocalTime formatar(String horario){
        LocalTime horarioFormatado = LocalTime.parse(horario, formatter);
        return horarioFormatado;
    }

    public static void calcularSaldoHoras(LocalTime entrada, int horas, LocalTime saida){
        LocalTime saidaPrevista = entrada.plusHours(horas);

        System.out.println("\nHorário de entrada: " + entrada);
        System.out.println("Horário de saída previsto: " + saidaPrevista);
        System.out.println("Horário real de saída: " + saida);

        Duration duracao = Duration.between(saidaPrevista, saida);

        System.out.printf("Saldo de horas: %sh %smin\n", duracao.toHours(), duracao.toMinutesPart());
    }
}

Saída:

Digite o horário de entrada (HH:mm): 
08:00
Digite a carga horária diária (em horas): 
8
Digite o horário real de saída (HH:mm): 
14:45

Horário de entrada: 08:00
Horário de saída previsto: 16:00
Horário real de saída: 14:45
Saldo de horas: -1h -15min
1 resposta

Oi, Igor! Como vai?

Você organizou bem a separação entre a classe Main e a classe RelogioDePonto, deixando a leitura dos dados em um lugar e o cálculo em outro. Um ponto interessante é que o resultado -1h -15min indica que a saída real foi antes da prevista, então o saldo ficou negativo, funcionando corretamente para esse caso.

Uma dica interessante para o futuro é usar Duration.abs() quando quiser exibir o valor do saldo sem misturar hora e minuto negativos, e depois indicar se foi crédito ou débito de horas. Veja este exemplo:


Duration duracao = Duration.between(saidaPrevista, saida);
String tipoSaldo = duracao.isNegative() ? "Debito" : "Credito";
Duration duracaoAbsoluta = duracao.abs();

System.out.printf(
    "Saldo de horas: %s de %dh %dmin%n",
    tipoSaldo,
    duracaoAbsoluta.toHours(),
    duracaoAbsoluta.toMinutesPart()
);

Esse código verifica se o saldo é negativo, transforma a duração em valor positivo para exibição e mostra se houve Debito ou Credito.

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