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?
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?
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]
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: