Problemas com o cálculo de horas, Help!

Seguinte, eu tenho essa classe abaixo que faz o calculo de horas trabalhadas. Estou com dois problemas o primeiro é como fazer para que quando o usuário digite que entrou no serviço as 20:00 e saiu as 03:00 da manhã do outro dia o sistema entenda que são 4 horas de um dia e mais 3 horas de outro dia ?? E a outra pergunta eh a seguinte qndo faço o calculo das horas totais sempre que acumula 24 horas o sistema zera o contador como se fosse outro dia. Eu queria saber como lidar com a hora sem ter o limite de 24 horas. Tem como ?? Abração, obrigado pela atenção…

/*

  • Calcula.java
  • Created on 12 de Setembro de 2006, 12:10
    */

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

/**
*

  • @author Fernando Bracher Beilke
    */

public class Calcula
{
public static void horas(int linha, javax.swing.JTable TabelaHoras) {
String diaSemana = TabelaHoras.getValueAt(linha,1).toString();
String horaInicial = TabelaHoras.getValueAt(linha,2).toString();
String horaFinal = TabelaHoras.getValueAt(linha,3).toString();
String almoco = “01:00”;

    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
    
    long minEntrada = getMinutos(horaInicial, formatter);
    long minSaida = getMinutos(horaFinal, formatter);
                    
    if (diaSemana == "Segunda" || diaSemana == "Terça-feira" || diaSemana == "Quarta-feira"
            || diaSemana == "Quinta-feira" || diaSemana == "Sexta-feira" || !diaSemana.equals("")) {
        if (minSaida <= 1050) {
            String horasNormais = subtraiHora(horaInicial,horaFinal,almoco).toString();
            TabelaHoras.setValueAt(almoco,linha,4); // Almoço
            TabelaHoras.setValueAt(horasNormais,linha,5); // Horas Normais 
            TabelaHoras.setValueAt("00:00",linha,6); // Horas Extras 50%
            TabelaHoras.setValueAt("00:00",linha,7); // Horas Extras 100%
        }
        if (minSaida > 1050 && minEntrada < 1050) {
            String horasNormais = subtraiHora(horaInicial,"17:30",almoco).toString();
            String horasExtras50 = subtraiHora("17:30",horaFinal,"00:00").toString();            
            TabelaHoras.setValueAt(almoco,linha,4); // Almoço
            TabelaHoras.setValueAt(horasNormais,linha,5); // Horas Normais
            TabelaHoras.setValueAt(horasExtras50,linha,6); // Horas Extras 50%
            TabelaHoras.setValueAt("00:00",linha,7); // Horas Extras 100%
        }
        else if (minSaida > 1050 && minEntrada > 1050) {
            String horasExtras50 = subtraiHora(horaInicial,horaFinal,"00:00").toString();            
            TabelaHoras.setValueAt("00:00",linha,5); // Horas Normais
            TabelaHoras.setValueAt(horasExtras50,linha,6); // Horas Extras 50%           
            TabelaHoras.setValueAt("00:00",linha,7); // Horas Extras 100%
        }
    }
    if (diaSemana == "Sábado") {   // Herda a variavel diaSemana da Classe Utildata
        String horasExtras50 = subtraiHora(horaInicial,horaFinal,almoco).toString();
        TabelaHoras.setValueAt(almoco,linha,4); // Almoço
        TabelaHoras.setValueAt("00:00",linha,5); // Horas Normais
        TabelaHoras.setValueAt(horasExtras50,linha,6); // Horas Extras 50%            
        TabelaHoras.setValueAt("00:00",linha,7); // Horas Extras 100%
    }                
    if (diaSemana == "Domingo") {   // Herda a variavel diaSemana da Classe Utildata
        String horasExtras100 = subtraiHora(horaInicial,horaFinal,almoco).toString();
        TabelaHoras.setValueAt(almoco,linha,4); // Almoço
        TabelaHoras.setValueAt("00:00",linha,5); // Horas Normais
        TabelaHoras.setValueAt("00:00",linha,6); // Horas Extras 50%            
        TabelaHoras.setValueAt(horasExtras100,linha,7); // Horas Extras 100%
    }            
}

/* Método utilizado para calcular as apurações em tempo real */

public static void Apuracoes(javax.swing.JTable TabelaHoras, javax.swing.JTextField KmApurado, 
        javax.swing.JTextField NormalApurado, javax.swing.JTextField Extra50Apurado,
        javax.swing.JTextField Extra100Apurado) {
    
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
    
    int somaKM = 0;
    String somaHsNormais = "00:00";
    String somaHsExtra50 = "00:00";
    String somaHsExtra100 = "00:00";
    for (int ln = 0;ln < TabelaHoras.getRowCount()-1;ln++) {
        if (!TabelaHoras.getValueAt(ln,8).toString().equals("")) {                
            int KM = Integer.parseInt(TabelaHoras.getValueAt(ln,8).toString());
            somaKM += KM;
            KmApurado.setText(String.valueOf(somaKM));                               
        }            
    }
    for (int ln = 0;ln < TabelaHoras.getRowCount()-1;ln++) {
        if (!TabelaHoras.getValueAt(ln,5).toString().equals("")) {                
            String HsNormal = TabelaHoras.getValueAt(ln,5).toString();
            somaHsNormais = somaHora(somaHsNormais,HsNormal);
            NormalApurado.setText(String.valueOf(somaHsNormais));                            
        }
    }
    for (int ln = 0;ln < TabelaHoras.getRowCount()-1;ln++) {
        if (!TabelaHoras.getValueAt(ln,6).toString().equals("")) {                
            String HsExtra50 = TabelaHoras.getValueAt(ln,6).toString();
            somaHsExtra50 = somaHora(somaHsExtra50,HsExtra50);
            Extra50Apurado.setText(String.valueOf(somaHsExtra50));                                
        }
    }
    for (int ln = 0;ln < TabelaHoras.getRowCount()-1;ln++) {
        if (!TabelaHoras.getValueAt(ln,7).toString().equals("")) {                
            String HsExtra100 = TabelaHoras.getValueAt(ln,7).toString();
            somaHsExtra100 = somaHora(somaHsExtra100,HsExtra100);
            Extra100Apurado.setText(String.valueOf(somaHsExtra100));                            
        }
    }        
}
    
/* Métodos utilizados para Cálculo de horas */

public static String subtraiHora(String horaInicial, String horaFinal, String Almoco) {        
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
            
    long minInicial = getMinutos(horaInicial, formatter);
    long minFinal = getMinutos(horaFinal, formatter);
    long minAlmoco = getMinutos(Almoco, formatter);
    long result = (minFinal - minInicial - minAlmoco) * 60 * 1000;
    Date data = new Date(result); 
    return formatter.format(data);
}

private static String somaHora(String horaInicial, String horaFinal) {        
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
            
    long minInicial = getMinutos(horaInicial, formatter);
    System.out.println(minInicial);
    long minFinal = getMinutos(horaFinal, formatter);
    System.out.println(minFinal);
    long result = (minFinal + minInicial) * 60 * 1000;
    System.out.println(result);
    Date data = new Date(result); 
    System.out.println(data);
    //return Float.toString(result);
    System.out.println(formatter.format(data));
    return formatter.format(data);        
}

public static String multiplicaHora(String qtdadeHoras, String valorHora) {        
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
            
    long minutos = getMinutos(qtdadeHoras, formatter);
    int valorHoras = Integer.parseInt(valorHora);
    long result = (minutos * valorHoras) / 60;
    return Long.toString(result);
}

private static long getMinutos(String hora, SimpleDateFormat formatter) {
    Date data;
    try {
        data = formatter.parse(hora);
    } catch (Exception e) {
        return 0;
    }
    long minutos = data.getTime() / 1000 / 60;
    return minutos;
}
//public long getTime() { }
private final static TimeZone GMT = TimeZone.getTimeZone("GMT");

beilke,

Veja se este exemplo ajuda você:
Edit: coloquei os métodos como double para poder usar horas quebradas

package com.testing.dates;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class HourBetweenDatesTest {
	public static void main(String[] args) throws ParseException {
		// mesmo dia
		System.out.println(hoursBetweenDates("01/01/06 08:00", "01/01/06 18:00"));
		
		// hora quebrada
		System.out.println(hoursBetweenDates("01/01/06 08:00", "01/01/06 17:30"));
		
		// dias diferentes
		System.out.println(hoursBetweenDates("01/01/06 20:00", "02/01/06 03:00"));

		// mais de 24 horas
		System.out.println(hoursBetweenDates("01/01/06 20:00", "03/01/06 03:00"));
	}
	
	public static double hoursBetweenDates(String date1Str, String date2Str) throws ParseException {
		SimpleDateFormat smf = new SimpleDateFormat("dd/MM/yy hh:mm");
		return hoursBetweenDates(smf.parse(date1Str), smf.parse(date2Str));
	}
	
	public static double hoursBetweenDates(Date date1, Date date2) {
		long diff = date2.getTime() - date1.getTime();
		return ((double) diff / 1000 / 60 / 60);
	}
}

Abraços!

Opa, já deu uma boa ajuda, mas ainda to com dúvidas… no caso quando falei de passar de 24 horas tem duas situações a primeira eh a que vc falou mesmo. o funcionario entra em um dia e sai no outro mas tem outro caso. Eu estou fazendo soma de todas as horas mais ou menos assim (05:00 + 09:00 + 08:00 + 10:00 … e assim vai) usando esse método que pega os minutos faz a soma e transforma em horas…

private static String somaHora(String horaInicial, String horaFinal) {
SimpleDateFormat formatter = new SimpleDateFormat(“HH:mm”);
formatter.setTimeZone(TimeZone.getTimeZone(“GMT”));

    long minInicial = getMinutos(horaInicial, formatter);
    long minFinal = getMinutos(horaFinal, formatter);
    long result = (minFinal + minInicial) * 60 * 1000;
    Date data = new Date(result); 
    return formatter.format(data);        
}

Porem quando ultrapassa 23:59 ele zera 00:00… como se fosse um dia novo… como faço pra mudar isso ??

Amigo,

Acho que eu entendi.

Veja se é isso:

	public static String somaHora(String horaInicial, String horaFinal) {
		double sumResult = getHours(horaInicial) + getHours(horaFinal);
		int hours = (int) sumResult;
		int minutes = (int) ((sumResult - hours) * 60);
		
		String hoursStr = String.valueOf(hours);
		String minutesStr = (minutes < 10 ? "0" : "") +  
			String.valueOf(minutes);
		
		return hoursStr + ":" + minutesStr;
	}
	
	private static double getHours(String hourMinuteStr) {
		String[] parts = hourMinuteStr.split(":");
		return Integer.valueOf(parts[0]) + ((double) Integer.valueOf(parts[1]) / 60);
	}

Testa esse método assim:

		// teste do calcula
		System.out.println(Calcula.somaHora("03:30", "80:30"));

Ele retorna 84:00, é isso mesmo?!

Abraços!

fcoury vc é O kra !!! putz deu certinho… brigadão…

só me diz uma coisa no começo quando vc me deu o código pra calcular hora com o dia. no meu codigo não dá, xo explicar. Eu tenho três campos, data inicial, hora inicial e hora final. Se por exemlplo o kra entra com os dados data inicial - 19/01/2000, hora inicial - 20:00 e hora final 02:00. Isso quer dizer que ele entrou dia 19/01/2000 e saiu no dia 20… Como lidar com isso ?? Proibo o usuário de entrar com um horario menor que a entrada ?? ou tem como fazer o sistema entender que o usuario trabalhou:

19/01/2000 - 20:00 até 24:00
20/01/2000 - 00:00 até 02:00 ??

Um abraço !!