Comparação de HORA usando Date

6 respostas
Polverini

Boa tarde pessoal,

Estou trabalhando em um sistema para dimensionamento de escala usando erlang, tenho alguns horarios de escala e tambem uma lista detalhada de 20 em 20 min quando coloca uma pessoa para trabalhar em um determinado horario (das 08 as 14 ) no dimensionamento de 20 min tem que apresentar 1 so que quando executo essa classe ele nao entra no horario das 08:00 as 08:20 e nem das 13:40 as 14:00 por outro lado apresenta 1 as 23:40 as 00:00,

Desde já agradeço

Segue:

package teste;
/*
 * if((escala.getTime()>=hrFormat[x].getTime())&&(escala2.getTime()<=hrFormat2[x].getTime())){
 */
import java.text.SimpleDateFormat;
import java.util.Date;

public class Teste {
	public static void main(String[] args) {
                                
		String [] hora = {"00:00","00:20","00:40","01:00","01:20","01:40","02:00","02:20","02:40","03:00","03:20","03:40",
				"04:00","04:20","04:40","05:00","05:20","05:40","06:00","06:20","06:40","07:00","07:20","07:40","08:00","08:20","08:40",
				"09:00","09:20","09:40","10:00","10:20","10:40","11:00","11:20","11:40","12:00","12:20","12:40","13:00","13:20","13:40",
				"14:00","14:20","14:40","15:00","15:20","15:40","16:00","16:20","16:40","17:00","17:20","17:40","18:00","18:20","18:40",
				"19:00","19:20","19:40","20:00","20:20","20:40","21:00","21:20","21:40","22:00","22:20","22:40","23:00","23:20","23:40"};

		String [] hora2 = {"00:20","00:40","01:00","01:20","01:40","02:00","02:20","02:40","03:00","03:20","03:40",
				"04:00","04:20","04:40","05:00","05:20","05:40","06:00","06:20","06:40","07:00","07:20","07:40","08:00","08:20","08:40",
				"09:00","09:20","09:40","10:00","10:20","10:40","11:00","11:20","11:40","12:00","12:20","12:40","13:00","13:20","13:40",
				"14:00","14:20","14:40","15:00","15:20","15:40","16:00","16:20","16:40","17:00","17:20","17:40","18:00","18:20","18:40",
				"19:00","19:20","19:40","20:00","20:20","20:40","21:00","21:20","21:40","22:00","22:20","22:40","23:00","23:20","23:40","00:00"};

		Date [] hrFormat = new Date [hora.length];
		Date [] hrFormat2 = new Date [hora2.length];
		int [] soma = new int[hrFormat.length];
		SimpleDateFormat trabHora = new SimpleDateFormat("kk:mm");    

		try{   
                                                //Conversão para Date
			for(int x = 0; x<hora.length;x++){
				hrFormat[x] = trabHora.parse(hora[x]);
				hrFormat2[x] = trabHora.parse(hora2[x]);
			}

			Date escala = trabHora.parse("08:00");
			Date escala2 = trabHora.parse("14:00");
                                                //Axo que aqui está o problema
			for(int x = 0; x<hrFormat.length;x++){
				if((hrFormat[x].after(escala)||(escala==hrFormat[x]))){
					if (hrFormat2[x].before(escala2)||(escala2==hrFormat2[x])){
						soma[x]=1;	
					}

				}   
			}
                                                //Imprime
			for(int x =0; x<hrFormat.length;x++){
				System.out.println(hrFormat[x]+" - "+hrFormat2[x]+"  ---- "+soma[x]);
			}
		}   
		catch(Exception e){   
			System.out.println(e);   
		}   


	}   

}

6 Respostas

A

olá brother…

seguinte vou passar o código e explicar o que estava acontecendo…

package forum;
 import  java.text.SimpleDateFormat;  
 import java.util.Date;  
   
 public class Teste {  
     public static void main(String[] args) {  
                                   
         String [] hora = {"00:00","00:20","00:40","01:00","01:20","01:40","02:00","02:20","02:40","03:00","03:20","03:40",  
                 "04:00","04:20","04:40","05:00","05:20","05:40","06:00","06:20","06:40","07:00","07:20","07:40","08:00","08:20","08:40",  
                 "09:00","09:20","09:40","10:00","10:20","10:40","11:00","11:20","11:40","12:00","12:20","12:40","13:00","13:20","13:40",  
                 "14:00","14:20","14:40","15:00","15:20","15:40","16:00","16:20","16:40","17:00","17:20","17:40","18:00","18:20","18:40",  
                 "19:00","19:20","19:40","20:00","20:20","20:40","21:00","21:20","21:40","22:00","22:20","22:40","23:00","23:20","23:40"};  
   
         String [] hora2 = {"00:20","00:40","01:00","01:20","01:40","02:00","02:20","02:40","03:00","03:20","03:40",  
                 "04:00","04:20","04:40","05:00","05:20","05:40","06:00","06:20","06:40","07:00","07:20","07:40","08:00","08:20","08:40",  
                 "09:00","09:20","09:40","10:00","10:20","10:40","11:00","11:20","11:40","12:00","12:20","12:40","13:00","13:20","13:40",  
                 "14:00","14:20","14:40","15:00","15:20","15:40","16:00","16:20","16:40","17:00","17:20","17:40","18:00","18:20","18:40",  
                 "19:00","19:20","19:40","20:00","20:20","20:40","21:00","21:20","21:40","22:00","22:20","22:40","23:00","23:20","23:40","00:00"};  
   
         Date [] hrFormat = new Date [hora.length];  
         Date [] hrFormat2 = new Date [hora2.length];  
         int [] soma = new int[hrFormat.length];  
         SimpleDateFormat trabHora = new SimpleDateFormat("kk:mm");      
   
         try{     
                                                 //Conversão para Date  
             for(int x = 0; x<hora.length;x++){  
                 hrFormat[x] = trabHora.parse(hora[x]);  
                 hrFormat2[x] = trabHora.parse(hora2[x]);  
             }  
   
             Date escala = trabHora.parse("08:00");  
             Date escala2 = trabHora.parse("14:00");  
                                                 //Axo que aqui está o problema  
             for(int x = 0; x<hrFormat.length;x++){  
                 if((hrFormat[x].after(escala)||(escala.equals(hrFormat[x])))){  
                     if (hrFormat2[x].before(escala2)||(escala2.equals(hrFormat2[x]))){  
                         soma[x]=1;    
                     }  
   
                 }     
             }  
                                                 //Imprime  
             for(int x =0; x<hrFormat.length;x++){  
                 System.out.println(hrFormat[x]+" - "+hrFormat2[x]+"  ---- "+soma[x]);  
             }  
         }     
         catch(Exception e){     
             System.out.println(e);     
         }     
   
   
     }     
   
 }

antes você estava utilizando o seguinte comando

if (hrFormat2[x].before(escala2)||(escala2==hrFormat2[x])){

porém neste if quando você compara escala2 == hrformat2[x] você esta comparando os objetos e por consequencia seus respectivos numeros hash.
Cada objeto em java possui um numero hash especifico e que serve como identidade daquele objeto.

O método equals da classe Date porém, compara realmente se o conteúdo da data é igual. É o mesmo funcionamento da classe String.

Espero ter ajudado…

Polverini

Ajudo muito =D
Brigadão

so um probleminha quando imprimo
aparece

Thu Jan 01 23:40:00 BRT 1970 - Thu Jan 01 00:00:00 BRT 1970 ---- 1

Sendo que deveria ser

Thu Jan 01 23:40:00 BRT 1970 - Thu Jan 01 00:00:00 BRT 1970 ---- 0

Vou tentando solucionar se alguem puder ajudar, lembrando que coloquei os horarios escala e escala2 fixos, porem são em média 100 horários diferentes que virão do banco oracle.

A

Olá brother…

note que ai tem um problema de lógica pois:

escala um sempre vale “08:00”
escala2 sempre vale “14:00”

até ai tudo certo porém quando encontra o if

if((hrFormat[x].after(escala)||(escala.equals(hrFormat[x])))){  
                     if (hrFormat2[x].before(escala2)||(escala2.equals(hrFormat2[x]))){

hrFormat[x] para as ultimas posições vale 23:40
hrFormat2[x] para as ultimas posices vale 00:00

no if está verifcando 23:40 é depois das 08:00 horas. Sim é.
no segundo if está verificando 00:00 é antes das 14:00. Sim é pois é o mesmo dia e 00:00 hora do dia 1 vem antes das 14:00 hora do mesmo dia 1

Espero ter ajudado…

Polverini

Bom consegui tratar esse problema porem surgiu mais um, quando coloco o horario das 23:18 as 06:30 (Que é um horario de escala usado) ou qualquer outro que passe de um dia para outro ele nao iguala soma a 1, outro exemplo 18:30 as 00:10, alguem pode me dar uma ideia de como solucionar ??

Código Atual:

package teste;

import java.text.SimpleDateFormat;
import javax.swing.JOptionPane;
import java.util.Date;

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

		//Tabela de Horarios 1		
		String [] hora = {"00:00","00:20","00:40","01:00","01:20","01:40","02:00","02:20","02:40","03:00","03:20","03:40",
				"04:00","04:20","04:40","05:00","05:20","05:40","06:00","06:20","06:40","07:00","07:20","07:40","08:00","08:20","08:40",
				"09:00","09:20","09:40","10:00","10:20","10:40","11:00","11:20","11:40","12:00","12:20","12:40","13:00","13:20","13:40",
				"14:00","14:20","14:40","15:00","15:20","15:40","16:00","16:20","16:40","17:00","17:20","17:40","18:00","18:20","18:40",
				"19:00","19:20","19:40","20:00","20:20","20:40","21:00","21:20","21:40","22:00","22:20","22:40","23:00","23:20","23:40"};

		//Tabela de Horarios 2
		String [] hora2 = {"00:20","00:40","01:00","01:20","01:40","02:00","02:20","02:40","03:00","03:20","03:40",
				"04:00","04:20","04:40","05:00","05:20","05:40","06:00","06:20","06:40","07:00","07:20","07:40","08:00","08:20","08:40",
				"09:00","09:20","09:40","10:00","10:20","10:40","11:00","11:20","11:40","12:00","12:20","12:40","13:00","13:20","13:40",
				"14:00","14:20","14:40","15:00","15:20","15:40","16:00","16:20","16:40","17:00","17:20","17:40","18:00","18:20","18:40",
				"19:00","19:20","19:40","20:00","20:20","20:40","21:00","21:20","21:40","22:00","22:20","22:40","23:00","23:20","23:40","24:00"};

		//Conversão para Date
		Date [] hrFormat = new Date [hora.length];
		Date [] hrFormat2 = new Date [hora2.length];
		int [] soma = new int[hrFormat.length];
		SimpleDateFormat trabHora = new SimpleDateFormat("kk:mm");    

		try{   
			for(int x = 0; x<hora.length;x++){
				hrFormat[x] = trabHora.parse(hora[x]);
				hrFormat2[x] = trabHora.parse(hora2[x]);
			}

			//Horario da escala
			Date escala = trabHora.parse(JOptionPane.showInputDialog(null, "HORÁRIO DE ENTRADA :"));
			Date escala2 = trabHora.parse(JOptionPane.showInputDialog(null, "HORÁRIO DE SAIDA :"));
			Date es = trabHora.parse("23:00");

			//Horaios contra Tabela1 e Tabela2
			for(int x = 0; x<hrFormat.length;x++){   
				if(hrFormat[x].after(escala)||(escala.equals(hrFormat[x]))){
					if (hrFormat2[x].before(escala2)||(escala2.equals(hrFormat2[x]))){
						if(hrFormat[x].after(escala2)){

						}else{
							soma[x]=1;
						} 
					}   
				}     
			}

			//Imprime
			System.out.println("ESCALA - "+escala+escala2+"\n");
			for(int x =0; x<hrFormat.length;x++){
				System.out.println(hrFormat[x]+" - "+hrFormat2[x]+"  ---- "+soma[x]);
			}
		}   
		//Erro
		catch(Exception e){   
			System.out.println(e);   
		}   
	}   

}
ViniGodoy

Use o Joda-Time. A API de datas do java é puro sofrimento para esse tipo de operação.

Polverini

To usando o Joda Time, ao inves de criar tabelas para comparação deixo duas fixas e uma somando 20 secs. a cada rodada, porém nao consigo faze a verifixcação se o horario é igual ou maior que a entrada e se é menos ou = a saida, to puxando pelo getMillis() pois pelo que entendi ele devolve o valor dos milisegundos, fico no aguardo de uma sugestão.

Segue o código:

/**
 *
 * @author estagio.desenv
 */

import org.joda.time.*;
import org.joda.time.format.*;

public class ContaHora {

	public static void main(String[] args) {

		int [] soma = new int[73];
                String [] imprime = new String[73];

                //Setado 23:40 -> date __ 06:40 -> saida __ 23:20 -> entrada
		DateTime date = new DateTime("2010-2-21T23:40:00.000-03:00");
		DateTime saida = new DateTime("2010-2-21T06:40:00.000-03:00");
		DateTime entrada = new DateTime("2010-2-21T23:20:00.000-03:00");
                DateTime acumula = date.plusMinutes(0);
                try{

                        int z=20;
                        //73 Horários a cada 20 min
			for(int x=0;x<73;x++){
                            imprime[x]=acumula.toString("HH:mm");
                            if(date.getMillis()>=entrada.getMillis()){
                                System.out.println("OK 1");
                                if(date.getMillis()<=saida.getMillis()){
                                    System.out.println("OK 2");
                                    soma[x]=1;
                                }
                            }
                            //Adiciona 20 Minutos por rodada
                            acumula = date.plusMinutes(z);
                            z+=20;
                         }

                        for(int x=0;x<imprime.length;x++){
                            System.out.println("Hora -> "+imprime[x]+" Soma -> "+soma[x]);
                        }
		}
		//Erro na conversão Exeção
		catch(Exception e){
			System.out.println(e+"ERRO DE CONVERSÃO DE HORAS");
		}
	}
}
Criado 22 de julho de 2010
Ultima resposta 26 de jul. de 2010
Respostas 6
Participantes 3