Subtrair uma data de outra

11 respostas
Zeed01

Boa noite Colegas !

Meu problema:

Recebo uma data, tenho que subtrair de outra e obter a resposta em anos, meses ou dias…
Alguma dica para subtrair duas datas ?

[]s

11 Respostas

Andre_Fonseca

talvez ajude http://joda-time.sourceforge.net/

Zeed01

Vixi amigo !

Acho que não entendi nada…
rsrsrs… mas valeu pela dica, vou quebrar um pouco a cabeça aqui.

[]s

Andre_Fonseca

uma outra alternativa, caso seja um calculo simples, é inverter a data, por exemplo, se você quiser souber quantos dias tem de 10-09-2008 até 10-08-2008, basta fazer (20081009 - 20081008)* 30 = 30 dias

Andre_Fonseca

o jodatime é uma API que facilita o calculo com datas, para fazer um calculo de diferença de dias você faria algo assim

Days d = Days.daysBetween(startDate, endDate); int days = d.getDays();

para usar basta fazer o download e usar no seu projeto

Zeed01

Opa… muito obrigado !

Se não for abusar, existe como fazer isso usando as classes da API, como Date ou Calendar ?

:oops:
Desculpe pela dúvida de iniciante…

Aproveitando o gancho do Joda Time… como funciona isso ? São projetos desenvolvidos e disponibilizados de forma free ?

[]s

gpd38

Estava pesquisando e encontrei isso.

ve se ajuda

http://www.guj.com.br/posts/list/9440.java#49662

Andre_Fonseca

Zeed01:
Opa… muito obrigado !

Se não for abusar, existe como fazer isso usando as classes da API, como Date ou Calendar ?

você pode fazer dos dois jeitos

Date data1 = Calendar.getInstance().getTime(); System.out.println(data1); DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); Date data2 = dateFormat.parse("10/08/2009"); System.out.println(data2);

Zeed01:

:oops:
Desculpe pela dúvida de iniciante…

Aproveitando o gancho do Joda Time… como funciona isso ? São projetos desenvolvidos e disponibilizados de forma free ?

[]s

acha, o importante é ter duvidas e procurar respondê-las… o jodatime tá hospedado no sourceforge, portanto é um projeto open source, http://pt.wikipedia.org/wiki/Open_source

gpd38

Encontrei este codigo tbm, porem foi implementado a força( hi hi )

public int Diferenca_Data(int data_atual, int data_prevista){

		int aDia, aMes, pDia, pMes, pAno, dia;
		int aux, i, aNumDiasMes, pNumDiasMes;
		int flag=0;

		aDia = data_atual/1000000;

		aux = data_atual%1000000;

		aMes = aux/10000;

		pDia = data_prevista/1000000;

		aux = data_prevista%1000000;

		pMes = aux/10000;

		pAno = aux%10000;

		while (aMes > pMes){

			if (flag == 1){

				pMes = pMes + 1;

			}

			pNumDiasMes = NumMes(pMes,pAno);

			if (aMes == pMes){

				aux = aDia;

			}else if (aMes > pMes && flag == 1){

				aux = pNumDiasMes;

			}else{

				aux = pNumDiasMes - pDia;

			}

			for (i=aux;i>0;i--){

				dia = 1 + dia;

			}

			flag = 1;
		}

		if (aDia > pDia){
			aux = aDia - pDia;

			for (i=aux;i>0;i--){

				dia = 1 + dia;

			}
		}

		return dia;
	}

	public int NumMes(int mes, int ano){
		int NumDiasMes;

		if ((mes==1)||(mes==3)||(mes==5)||(mes==7)||(mes==8)||(mes==10)||(mes==12))
		{
			NumDiasMes=31;
		}
		else if ((mes==4)||(mes==6)||(mes==9)||(mes==11))
		{
			NumDiasMes=30;
		}
		else
		{

			if (((ano % 4) == 0) && ((ano % 100) == 0))

				NumDiasMes=29;

			else if ((ano % 400) == 0)

				NumDiasMes=29;

			else
				NumDiasMes=28;
		}

		return NumDiasMes;
	}

Aqui neste codigo so nao calcula a subtração.

Vc teria que fazer isso.

Zeed01

Obrigado novamente…

Mas nesse exemplo que você deu não vi onde esta a subtração…

Date data1 = Calendar.getInstance().getTime();   
System.out.println(data1);   
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");   
Date data2 = dateFormat.parse("10/08/2009");   
System.out.println(data2);

[]s

Andre_Fonseca

oi,

eu coloquei apenas formas de calcular uma data, para fazer a diferença entre elas você poderia fazer algo assim

Date date1 = new SimpleDateFormat("dd/MM/yyyy").parse("17/08/2008");  
int data1 = Integer.parseInt(new SimpleDateFormat("yyyyddMM").format(date1));
		
Date date2 = new SimpleDateFormat("dd/MM/yyyy").parse("17/09/2008");  
int data2 = Integer.parseInt(new SimpleDateFormat("yyyyddMM").format(date2));
		
System.out.println(data2+"-"+data1);
System.out.println("A diferença é:"+(data2-data1)*30+" dias");

mas eu ainda acho que o jodatime ajuda bastante, você vai escrever muito menos código

abs

maior_abandonado

apenas pra documentar, pra se ter no forum caso seja util pra alguém futuramente, ja que ja foi passado no msn...

diferença entre as datas exibindo quantos dias meses e anos (não somente em dias) se passaram entre 2 datas:

public void calcula(String dataI,String dataF){
        try {
            //setando o formato das datas para serem criadas
            SimpleDateFormat f = new SimpleDateFormat("ddMMyy");
            
            //setando as datas inicial e final
            Date inicio = f.parse(dataI);
            Date fim    = f.parse(dataF);//eu queria chamar de final mais nao pode
            
            
            int dia1 = inicio.getDate();   
            int mes1 = inicio.getMonth();//essa é util depois alem do coment acima   
            int ano1 = inicio.getYear();
            
            int dia2 = fim.getDate();// = inicio.getDate();   
            int mes2 = fim.getMonth();// = inicio.getMonth();   
            int ano2 = fim.getYear();// = inicio.getYear();
            
            //valor total de dias de cada mes, util pra dizer que passou 
            //1 mes e 5 dias ao invés de 35 dias
            final int[] diasMes = {31,28,31,30,31,30,31,31,30,31,30,31};
            
            //essas serão as finais mesmo
            int dia=0;
            int mes=0;
            int ano=0;
            
            //enquanto não for a mesma data
            while( !( dia1 == dia2 && mes1 == mes2 && ano1 == ano2) )
            {
                
                //bisexto... tive problemas anteriores com o ano... por isso to 
                if (ano1%4==0)
                    diasMes[1]=29;
                else
                    diasMes[1]=28;
                
                dia++;//somando dias
                //determina quando passo 1 mes
                if (dia == diasMes[mes1]){
                    mes++;
                    dia = 0;//somo 1 mes e 0 dias
                }
                //determina quando passo 1 ano
                if (mes == 12){
                    ano++;
                    mes = 0;//somou 1 ano e 0 meses
                }
                
                inicio.setDate(dia1+1);
                
                //==============================================================
                dia1 = inicio.getDate();   
                mes1 = inicio.getMonth();   
                ano1 = inicio.getYear();
                System.out.println(dia1+"/"+mes1+"/"+ano1+" -- "+dia2+"/"+mes2+"/"+ano2);
                //==============================================================
                
            }
            System.out.println("dias: "+dia+" meses: "+mes+" anos:"+ano);
            //saida.setText("dias:"+dia+" meses:"+mes+" anos:"+ano);
            
        } catch (ParseException ex) {
            System.out.println("erro: ");ex.printStackTrace();
        }    

        
    }

não é o jeito mais rápido de se obter isso mais, resolve o problema e não vai causar problemas de performance...

Criado 16 de setembro de 2008
Ultima resposta 17 de set. de 2008
Respostas 11
Participantes 4