Calcular diferença de meses entre duas datas

Oi gente.

Tenho dois objetos Date, dataInicio e dataFim e preciso pegar a quantidade de meses entre as duas e não estou conseguindo, eu consegui a diferença entre dias, mas preciso de meses.

Alguém pode me auxiliar?

Date difference in months - Forum da Sun
Date difference in months - Stackoverflow

Isso ajuda?

Voce pode fazer o seguinte:

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


public class DiferencaMeses {

	/**
	 * @param args
	 * @throws ParseException 
	 */
	public static void main(String[] args) throws ParseException {
		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
		Date dataInicio = format.parse("01/01/2010");
		Date dataFim = format.parse("01/03/2010");

		/*
		 * valor de um mes em milisegundos, sendo que os valores sao:
		 * 30 dias no mes, 24 horas no dia, 60 minutos por hora, 60 segundos por minuto e 1000 milisegundos  
		 */
		final double MES_EM_MILISEGUNDOS = 30.0 * 24.0 * 60.0 * 60.0 * 1000.0;
		//final double MES_EM_MILISEGUNDOS = 2592000000.0;
		
		double numeroDeMeses = (double)((dataFim.getTime() - dataInicio.getTime())/MES_EM_MILISEGUNDOS);
		
		System.out.println("numero de meses: "+numeroDeMeses);
	}

}

T+

Não usem calculos matemáticos como o de cima e alguns exemplos nos links passados. Usem Calendar.

Sempre use Calendar para calculos de datas (a menos que use outra API melhor) e nunca faça os calculos matemáticamente como se aprende na escola não é assim que funciona na realidade.

Isso mesmo.

Calcular tempos entre data usando milisegundos nem sempre dá certo. Use a API calendar, como o amigo recomendou.

Puxa adorei o exemplo… Poderia falar um pouco do SimpleDateFormat é uma biblioteca do Java, não?

Sem contar que ali ele esta fazendo o cálculo para meses que tem 30 dias.

Gostaria que postassem o codigo que utilize Calendar para determinar o diferenca entre dois meses apenas utilizando a API da Calendar, pois em determinado momento qualquer um tera que fazer um Calendar.getTimeInMIlli(); entao voltaremos a situacao anterior! Procurei alguns posts aqui mesmo no GUJ e nao encontrei nada que nao envolvesse uma algebra simples.

T+

se quer saber a diferença de meses… desta forma acho q serve…

Calendar c1 = Calendar.getInstance();
			
			Calendar c2 = Calendar.getInstance();
			c2.add(Calendar.MONTH, -6);
			
			System.out.println("mes 1 "+c1.get(Calendar.MONTH));
			System.out.println("mes 2 "+c2.get(Calendar.MONTH));
			System.out.println((c1.get(Calendar.MONTH)-c2.get(Calendar.MONTH)));

Entao alves.felipe, seu codigo nao funciona, veja o exemplo que eu fiz usando ele:

public static void main(String[] args) {
		SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		Calendar c1 = Calendar.getInstance();  
		Calendar c2 = Calendar.getInstance();
		c1.add(Calendar.DAY_OF_MONTH, 10);
		c1.add(Calendar.MONTH, +3);  
		c1.add(Calendar.YEAR, +10);
		System.out.println("data inicio: "+formatador.format(c2.getTime()));  
		System.out.println("mes final "+formatador.format(c1.getTime()));  
		System.out.println("diferenca de meses: "+(+c1.get(Calendar.MONTH)-c2.get(Calendar.MONTH)));  
	}

Agora eh a saida:

data inicio: 02/07/2010 10:31:16
mes final 12/10/2020 10:31:16
diferenca de meses: 3

Veja que temos uma data com a ano de 2010 e outra com o ana de 2020, portanto existe mais de 100 meses de diferenca entre uma data e outra e seu codigo devolve apenas 3 meses. Utilizando o codigo que implementa uma algebra simples a saida eh:

numero de meses: 125.15189018518518

T+

JodaTime é a resposta.

[quote=Vini Fernandes]Entao alves.felipe, seu codigo nao funciona, veja o exemplo que eu fiz usando ele:

T+[/quote]

pois é…código faiado!!!
vou pesquisar como que faz sem usar calculos matematicos como disse o sergiotaborda…

Vini Fernandes,
faz um teste ai usando o seu código, com o ano de 2016…

[code]
SimpleDateFormat format = new SimpleDateFormat(“dd/MM/yyyy”);
java.util.Date dataInicio = format.parse(“01/07/2010”);
java.util.Date dataFim = format.parse(“01/07/2016”);

	        /*  
	         * valor de um mes em milisegundos, sendo que os valores sao:  
	         * 30 dias no mes, 24 horas no dia, 60 minutos por hora, 60 segundos por minuto e 1000 milisegundos    
	         */   
	        final double MES_EM_MILISEGUNDOS = 30.0 * 24.0 * 60.0 * 60.0 * 1000.0;   
	        //final double MES_EM_MILISEGUNDOS = 2592000000.0;   
	           
	        double numeroDeMeses = (double)((dataFim.getTime() - dataInicio.getTime())/MES_EM_MILISEGUNDOS);   
	           
	        System.out.println("numero de meses: "+numeroDeMeses);   [/code]

o resultado é: numero de meses: 73.06666666666666

e se usar a mesma data, (não tratei para dias, somente mês):


int ano = 2016;
			
			Calendar cIni = Calendar.getInstance();
			
			Calendar cFIm = Calendar.getInstance();
			cFIm.set(Calendar.YEAR, ano);
			
			int difMes = cFIm.get(Calendar.MONTH)-cIni.get(Calendar.MONTH);
			int difAno = ((cFIm.get(Calendar.YEAR)-cIni.get(Calendar.YEAR))*12);
			int total = difAno+difMes;
			System.out.println("diferenca meses "+total);

o resultado é: diferenca meses 72

2016-2010 = 6 anos | 6anos * 12meses = 72 meses…
acho que agora funciona…

Oi Carol,

Se vai fazer esse tipo de trabalho com datas, use a JODA-Time:
http://joda-time.sourceforge.net/

É centenas de vezes mais simples do que trabalhar com as classes de data do Java.

[quote=Vini Fernandes]Gostaria que postassem o codigo que utilize Calendar para determinar o diferenca entre dois meses apenas utilizando a API da Calendar, pois em determinado momento qualquer um tera que fazer um Calendar.getTimeInMIlli(); entao voltaremos a situacao anterior! Procurei alguns posts aqui mesmo no GUJ e nao encontrei nada que nao envolvesse uma algebra simples.

T+[/quote]

A lógica é sempre a mesma e é muito simples. Comece na data inicial e adicione uma unidade até chegar na data final. o numero de unidades adicionadas é o numero que existe entre elas dessa unidade.



public int mesesEntre(Date a , Date b ){
Calendar inicial = Calendar.getInstance().setTime(a);

int count = 0;

while (inicial.get(Calendar.MONTH) != b.get(Calendar.MONTH)){
    inicial.add(Calendar.MONTH, 1);

     count ++;
}

return count;

}

Não ha nenhum codigo de subtração aqui e não ha redução a milisegundos.

Só completando a idéia do sergiotaborda, segue o código para calcular a diferença de meses de qqr período de data

[code]public static int getMonthDiff(Date dateStart, Date dateEnd) {
int count = 0;
if (dateStart != null && dateEnd != null && dateStart.before(dateEnd)) {

        Calendar clStart = Calendar.getInstance();
        clStart.setTime(dateStart);

        Calendar clEnd = Calendar.getInstance();
        clEnd.setTime(dateEnd);

        while (clStart.get(Calendar.MONTH) != clEnd.get(Calendar.MONTH) || clStart.get(Calendar.YEAR) != clEnd.get(Calendar.YEAR)) {
            clStart.add(Calendar.MONTH, 1);
            count++;
        }
    }
    return count;
}[/code]
1 curtida
	public static int mesesEntre(Calendar inicial , Calendar fim ){  
		int qtdMesesIni = (inicial.get(Calendar.YEAR) * 12) + inicial.get(Calendar.MONTH);
		int qtdMesesFim = (fim.get(Calendar.YEAR) * 12) + fim.get(Calendar.MONTH);
		return qtdMesesFim - qtdMesesIni;
	}

Joda Time:

DateTime inicio = new DateTime(2012, 2, 28, 0, 0, 0, 0);
DateTime fim = new DateTime(2013, 8, 28, 13, 30, 0, 0);
System.out.println(Months.monthsBetween(inicio, fim).getMonths

:lol: