Preciso de ajuda para fazer um metodo que converta Inteiro para ano, mês, dias

52 respostas
E

pessoal seguinte sou novo no forum e tô precisando uma ajuda de vcs.
o metodo que fiz eh assim

public static void main(String[] args) {
		Double dias = 365.00;  
		Integer mes = 0;  
		Integer ano = 0;  
		if (dias == 30 ) { 
			mes+=1;
			dias-=30;
		}
		while (dias>=30.42){  
			mes+=1;  
			dias-=30.42;//30.42 e aprox qnts dias tem 1 mes se for contar 365 como 1 ano  
			if (mes==12) { 
				ano +=1;  
				mes-=mes ; 
			}
		}  
		System.out.println(dias);
		System.out.println(mes);
		System.out.println(ano);
	}


}
}


 q qndo boto o valor 365 exato vem 1 ano e 5 dias alguém sabe o que é?

52 Respostas

E

agradeço antecipadamente

T

Amigo, quando você passa pelo while, quantas vezes você fica dentro dele?

Você nunca vai entrar dentro do if (mes==12) se o valor Double dias = 365.00; for 365.00, concorda?

Por que?
Divida 365.00 por 30.42.

Dá 11.99 e nunca 12 :smiley:

E

TreTaA:
Amigo, quando você passa pelo while, quantas vezes você fica dentro dele?

Você nunca vai entrar dentro do if (mes==12) se o valor Double dias = 365.00; for 365.00, concorda?

Por que?
Divida 365.00 por 30.42.

Dá 11.99 e nunca 12 :D

ja vi isso só botei 30.41666666666667 q da 12 certinho

E

erivanrgj:
TreTaA:
Amigo, quando você passa pelo while, quantas vezes você fica dentro dele?

Você nunca vai entrar dentro do if (mes==12) se o valor Double dias = 365.00; for 365.00, concorda?

Por que?
Divida 365.00 por 30.42.

Dá 11.99 e nunca 12 :D

ja vi isso só botei 30.41666666666667 q da 12 certinho


trocando o resultado fica 0/11/30.41666666666667

T

Tente colocar o valor 30.41

Assim:

public static void main(String[] args) { Double dias = 365.00; Integer mes = 0; Integer ano = 0; if (dias == 30 ) { mes+=1; dias-=30; } while (dias>=30.41){ mes+=1; dias-=30.41;//30.41 e aprox qnts dias tem 1 mes se for contar 365 como 1 ano if (mes==12) { ano +=1; mes-=mes ; } } System.out.println(dias); System.out.println(mes); System.out.println(ano); }

E

TreTaA:
Tente colocar o valor 30.41

Assim:

public static void main(String[] args) { Double dias = 365.00; Integer mes = 0; Integer ano = 0; if (dias == 30 ) { mes+=1; dias-=30; } while (dias>=30.41){ mes+=1; dias-=30.41;//30.41 e aprox qnts dias tem 1 mes se for contar 365 como 1 ano if (mes==12) { ano +=1; mes-=mes ; } } System.out.println(dias); System.out.println(mes); System.out.println(ano); }

ja tentei da certo qndo o dia eh 365 só q tpw se por 90 dias ja da errado = /

E

Por que é que precisa de um while e de usar double? De onde veio esse número mágico “30.42”?

Que eu saiba, quando se precisa saber quantos meses e dias são 100 dias, normalmente se diz “3 meses e 10 dias” porque cada mês comercial é considerado como tendo 30 dias. E quando se diz “370 dias”, se diz “3 anos e 10 dias” (não 3 anos e 5 dias) porque cada ano comercial tem 360 dias, não 365 dias.

É esse tipo de conta que você precisa fazer?

Matheus_Paiva

eu juro que não entendi o pq de 30,41 ||30,42
um mês comercial tem 30 dias …

J

Amigo… será que é só isso que você precisa ???

public class Dias {

	public static void main(String[] args) {
		
		int dias = 405;
		int anos = dias / 360;
		dias = dias % 360;
		int meses = dias / 30;
		dias = dias % 30;
		System.out.println("Anos: " + anos + " - Meses: " + meses + " - Dias: " + dias);
		
	}
}

Ou eu entendi errado?

T

Olha, eu não quis mudar a solução que o amigo propôs. Entretanto foi até um erro da minha parte, pois você pode ter uma solução melhor, como o amigo jmmenezes mostrou.

Pensa bem, erivanrgj: E se o número for um número maior? Tipo 975.

Seu programa vai retornar 0 anos. Você só está tratando caso o mês for igual a 12.

Deixo a dica pra ti:

Pense em uma solução melhor para o caso.
Aposto que você vai conseguir!

Se precisar de ajuda, é só avisar :smiley:

novato25

Bom, se eu entendi a sua questão, eu não vejo neste caso como você poderá fazer cálculos considerando efetivamente um ano como tendo 365 dias. Quantos dias tem um mês? é variável. Mas você pode simplificar os cálculos utilizando o ano comercial:

Chama-se ano comercial o período de tempo em que se considera que o ano tem 360 dias e cada um dos meses 30 dias, indistintamente.
É utilizado na contabilidade e também na matemática financeira com o objetivo de simplificar os cálculos com datas.

Fonte: http://pt.wikipedia.org/wiki/Ano_comercial

E

novato25:
Bom, se eu entendi a sua questão, eu não vejo neste caso como você poderá fazer cálculos considerando efetivamente um ano como tendo 365 dias. Quantos dias tem um mês? é variável. Mas você pode simplificar os cálculos utilizando o ano comercial:

Chama-se ano comercial o período de tempo em que se considera que o ano tem 360 dias e cada um dos meses 30 dias, indistintamente.
É utilizado na contabilidade e também na matemática financeira com o objetivo de simplificar os cálculos com datas.

Fonte: http://pt.wikipedia.org/wiki/Ano_comercial

pensei que o ano comercial tinha 365 dias o0

E

TreTaA:
Olha, eu não quis mudar a solução que o amigo propôs. Entretanto foi até um erro da minha parte, pois você pode ter uma solução melhor, como o amigo jmmenezes mostrou.

Pensa bem, erivanrgj: E se o número for um número maior? Tipo 975.

Seu programa vai retornar 0 anos. Você só está tratando caso o mês for igual a 12.

Deixo a dica pra ti:

Pense em uma solução melhor para o caso.
Aposto que você vai conseguir!

Se precisar de ajuda, é só avisar :D


brow meu pensamento foi o seguinte, o mes inicia com 0 e a cada 30 dias ele ganha 1 quando ele chega = a 12 ele zera e o ano ganha 1

E

jmmenezes:
Amigo… será que é só isso que você precisa ???

public class Dias {

	public static void main(String[] args) {
		
		int dias = 405;
		int anos = dias / 360;
		dias = dias % 360;
		int meses = dias / 30;
		dias = dias % 30;
		System.out.println("Anos: " + anos + " - Meses: " + meses + " - Dias: " + dias);
		
	}
}

Ou eu entendi errado?


isso msm cara me prendi ao modo de pensar e travei obrigado funcionou

J

TreTaA:

lha, eu não quis mudar a solução que o amigo propôs. Entretanto foi até um erro da minha parte, pois você pode ter uma solução melhor, como o amigo jmmenezes mostrou.

Pensa bem, erivanrgj: E se o número for um número maior? Tipo 975.

Seu programa vai retornar 0 anos. Você só está tratando caso o mês for igual a 12.

Deixo a dica pra ti:

Pense em uma solução melhor para o caso.
Aposto que você vai conseguir!

Se precisar de ajuda, é só avisar

Exatamente!!!
E não só pensar em uma solução melhor, como saber exatamente para que vai usar essa solução.

Como a questão de dias/mês é variável, talvez precise controlar isso…
Tem a questão do ano bissexto!

Ops… calendário não é uma coisa tão simples assim e nem tão facil de controlar “na unha”…

Qual o objetivo ???

E

jmmenezes:
TreTaA:

lha, eu não quis mudar a solução que o amigo propôs. Entretanto foi até um erro da minha parte, pois você pode ter uma solução melhor, como o amigo jmmenezes mostrou.

Pensa bem, erivanrgj: E se o número for um número maior? Tipo 975.

Seu programa vai retornar 0 anos. Você só está tratando caso o mês for igual a 12.

Deixo a dica pra ti:

Pense em uma solução melhor para o caso.
Aposto que você vai conseguir!

Se precisar de ajuda, é só avisar

Exatamente!!!
E não só pensar em uma solução melhor, como saber exatamente para que vai usar essa solução.

Como a questão de dias/mês é variável, talvez precise controlar isso…
Tem a questão do ano bissexto!

Ops… calendário não é uma coisa tão simples assim e nem tão facil de controlar “na unha”…

Qual o objetivo ???

projeto da facul
a ideia eh o seguinte criar 1 soft que vai calcular pena com base ao calculo penal ;
como a pena pode variar de meses a anos resolvi passar tudo pra dias q fica mais facil de trabalhar e no final eh só transformar os dias em meses , anos e dias novamente
creio que essa solução que o amigo postou vai resolver meu problema …

desde já agradeço a todos mt obrigado msm vcs me ajudaram a abrir a cabeça e n fica martelando numa coisa só.
“Loucos são aqueles que tentam varias vezes a mesma coisas esperando obter resultado diferente”

J

projeto da facul
a ideia eh o seguinte criar 1 soft que vai calcular pena com base ao calculo penal ;
como a pena pode variar de meses a anos resolvi passar tudo pra dias q fica mais facil de trabalhar e no final eh só transformar os dias em meses , anos e dias novamente
creio que essa solução que o amigo postou vai resolver meu problema …

desde já agradeço a todos mt obrigado msm vcs me ajudaram a abrir a cabeça e n fica martelando numa coisa só.
“Loucos são aqueles que tentam varias vezes a mesma coisas esperando obter resultado diferente”

Ok…
só fica uma recomendação… se quer algo mais exato, estude a classe Calendar!
Você pode trabalhar com dias e depois usar a Calendar para fazer os cálculos!

E

jmmenezes:
projeto da facul
a ideia eh o seguinte criar 1 soft que vai calcular pena com base ao calculo penal ;
como a pena pode variar de meses a anos resolvi passar tudo pra dias q fica mais facil de trabalhar e no final eh só transformar os dias em meses , anos e dias novamente
creio que essa solução que o amigo postou vai resolver meu problema …

desde já agradeço a todos mt obrigado msm vcs me ajudaram a abrir a cabeça e n fica martelando numa coisa só.
“Loucos são aqueles que tentam varias vezes a mesma coisas esperando obter resultado diferente”

Ok…
só fica uma recomendação… se quer algo mais exato, estude a classe Calendar!
Você pode trabalhar com dias e depois usar a Calendar para fazer os cálculos!


hum vc tem algum material de referencia bom pra calendar

drsmachado

erivanrgj:

hum vc tem algum material de referencia bom pra calendar

Tenta estes:
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html
e
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/GregorianCalendar.html

E

drsmachado:
erivanrgj:

hum vc tem algum material de referencia bom pra calendar

Tenta estes:
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html
e
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/GregorianCalendar.html

então

Calendar c = Calendar.getInstance();

c.add(Calendar.DATE, 2);

fazendo isso ele está adicionando 2 dias a data de hj…
e se eu quiser determinar pra q no lugar da data de hj ele pegue tipw 00/00/0000 (“dd/MM/yyyy”), como faço ?

drsmachado

erivanrgj:
drsmachado:
erivanrgj:

hum vc tem algum material de referencia bom pra calendar

Tenta estes:
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html
e
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/GregorianCalendar.html

então

Calendar c = Calendar.getInstance();

c.add(Calendar.DATE, 2);

fazendo isso ele está adicionando 2 dias a data de hj…
e se eu quiser determinar pra q no lugar da data de hj ele pegue tipw 00/00/0000 (“dd/MM/yyyy”), como faço ?

int ano = 2010;
int mes = 0/ //(começa de 0 e vai ate 11)
int dia = 1;
Calendar calendario = new GregorianCalendar(ano, mes, dia);
E

drsmachado:
erivanrgj:
drsmachado:
erivanrgj:

hum vc tem algum material de referencia bom pra calendar

Tenta estes:
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html
e
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/GregorianCalendar.html

então

Calendar c = Calendar.getInstance();

c.add(Calendar.DATE, 2);

fazendo isso ele está adicionando 2 dias a data de hj…
e se eu quiser determinar pra q no lugar da data de hj ele pegue tipw 00/00/0000 (“dd/MM/yyyy”), como faço ?

int ano = 2010; int mes = 0/ //(começa de 0 e vai ate 11) int dia = 1; Calendar calendario = new GregorianCalendar(ano, mes, dia);

só que pro meu problema axo q n resolve pq eh o seguinte eu n quero saber qnt tempo vai ser daqui a 20 dias eu quero eh pegar por ex: 790 e saber qnto tempo tem isso sabe ?
ai a ideia q tive foi

int ano =0000; int mes=0; int dia = 0; Calendar calendario = new GregorianCalendar(ano, mes, dia); c.add(Calendar.DATE, 790); System.out.println(c.getTime())
ai como resultado viria o ano mes e dias q tem em 790 dias entendeu ?

só q n funfou = /

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
			int ano = 0000;
			int mes =0;
			int dia=0;
			Calendar calendar = new GregorianCalendar(ano,mes,dia);
			calendar.add(calendar.DATE,365);
			System.out.println(dateFormat.format(calendar.getTime()));

só q o resultado ta sendo :30/12/0001

drsmachado

Acontece que não há uma fórmula mágica que faça essa conversão.
1 - Meses tem 28, 29, 30 ou 31 dias, dependendo de uma série de fatores.
2 - Anos possuem 365 ou 366 dias (caso seja bissexto).

Se o intervalo for de 120 dias, não exatamente teremos 4 meses, podemos ter:

a) 31 + 28 + 31 + 30 = 1/1 até 30/04 - 4 meses exatos (ano normal)

b) 31 + 29 + 31 + 29 = 1/1 até 29/04 - 3 meses e 29 dias (ano bissexto)

c ) 31 + 31 + 30 + 28 = 1/7 até 28/09 - 3 meses e 28 dias

E assim por diante.

Quando se envolve anos, como por exemplo, penas de 18 anos, 9 meses e 15 dias, como fará o cálculo? Esses 18 anos consideram quantos bissextos?

Sinceramente, você vai precisar considerar cada uma destas questões, a não ser que prefira fazer um software porco, pois, mês comercial não serve como base para cálculo penal e, ao ser anunciada a pena, não há como saber quando esta será iniciada, se já está sendo cumprida, quanto tempo se passou, etc.

Não querendo te desanimar, mas vai precisar de mais do que converter em dias para poder realizar este cálculo.

E

drsmachado:
Acontece que não há uma fórmula mágica que faça essa conversão.
1 - Meses tem 28, 29, 30 ou 31 dias, dependendo de uma série de fatores.
2 - Anos possuem 365 ou 366 dias (caso seja bissexto).

Se o intervalo for de 120 dias, não exatamente teremos 4 meses, podemos ter:

a) 31 + 28 + 31 + 30 = 1/1 até 30/04 - 4 meses exatos (ano normal)

b) 31 + 29 + 31 + 29 = 1/1 até 29/04 - 3 meses e 29 dias (ano bissexto)

c ) 31 + 31 + 30 + 28 = 1/7 até 28/09 - 3 meses e 28 dias

E assim por diante.

Quando se envolve anos, como por exemplo, penas de 18 anos, 9 meses e 15 dias, como fará o cálculo? Esses 18 anos consideram quantos bissextos?

Sinceramente, você vai precisar considerar cada uma destas questões, a não ser que prefira fazer um software porco, pois, mês comercial não serve como base para cálculo penal e, ao ser anunciada a pena, não há como saber quando esta será iniciada, se já está sendo cumprida, quanto tempo se passou, etc.

Não querendo te desanimar, mas vai precisar de mais do que converter em dias para poder realizar este cálculo.

porem os juízes usam o mês comercial como base de calc, pois n importa se o ano vai ser b sexto , tem 30 ou 28 dias até pq qndo eh declarado 1 pena não se sabe quando ele vai começar a cumprir na verdade n sabe nem se vai cumprir, no livro de calc penal q vi ele usa o ano com 365 e mês como 30

E

erivanrgj:
drsmachado:
Acontece que não há uma fórmula mágica que faça essa conversão.
1 - Meses tem 28, 29, 30 ou 31 dias, dependendo de uma série de fatores.
2 - Anos possuem 365 ou 366 dias (caso seja bissexto).

Se o intervalo for de 120 dias, não exatamente teremos 4 meses, podemos ter:

a) 31 + 28 + 31 + 30 = 1/1 até 30/04 - 4 meses exatos (ano normal)

b) 31 + 29 + 31 + 29 = 1/1 até 29/04 - 3 meses e 29 dias (ano bissexto)

c ) 31 + 31 + 30 + 28 = 1/7 até 28/09 - 3 meses e 28 dias

E assim por diante.

Quando se envolve anos, como por exemplo, penas de 18 anos, 9 meses e 15 dias, como fará o cálculo? Esses 18 anos consideram quantos bissextos?

Sinceramente, você vai precisar considerar cada uma destas questões, a não ser que prefira fazer um software porco, pois, mês comercial não serve como base para cálculo penal e, ao ser anunciada a pena, não há como saber quando esta será iniciada, se já está sendo cumprida, quanto tempo se passou, etc.

Não querendo te desanimar, mas vai precisar de mais do que converter em dias para poder realizar este cálculo.

porem os juízes usam o mês comercial como base de calc, pois n importa se o ano vai ser b sexto , tem 30 ou 28 dias até pq qndo eh declarado 1 pena não se sabe quando ele vai começar a cumprir na verdade n sabe nem se vai cumprir, no livro de calc penal q vi ele usa o ano com 365 e mês como 30


eu perguntei a 1 juíza ela me disse 1 ex. um cara foi condenado a 1 mês de prisão mês comercial tem 30 dias e ele foi preso dia primeiro de fevereiro que tem 28 dias , no dia 1 de março ele ja tinha comprido toda sua pena e passado 28 dias na cadeia

drsmachado

erivanrgj:

porem os juízes usam o mês comercial como base de calc, pois n importa se o ano vai ser b sexto , tem 30 ou 28 dias até pq qndo eh declarado 1 pena não se sabe quando ele vai começar a cumprir na verdade n sabe nem se vai cumprir, no livro de calc penal q vi ele usa o ano com 365 e mês como 30
[…]
eu perguntei a 1 juíza ela me disse 1 ex. um cara foi condenado a 1 mês de prisão mês comercial tem 30 dias e ele foi preso dia primeiro de fevereiro que tem 28 dias , no dia 1 de março ele ja tinha comprido toda sua pena e passado 28 dias na cadeia

Aí a questão é diferente…
1000 dias = x meses e y dias
1 mes = 30 dias
1000 / 30 = 33
1000 % 30 = 10
1000 dias = 33 meses e 10 dias
1 ano = 12 meses
33 meses = Z anos e n meses
33 / 12 = 2
33 % 12 = 9
1000 dias = 2 anos, 9 meses e 10 dias.

Pronto, problema resolvido.

J

erivanrgj:
drsmachado:
Acontece que não há uma fórmula mágica que faça essa conversão.
1 - Meses tem 28, 29, 30 ou 31 dias, dependendo de uma série de fatores.
2 - Anos possuem 365 ou 366 dias (caso seja bissexto).

Se o intervalo for de 120 dias, não exatamente teremos 4 meses, podemos ter:

a) 31 + 28 + 31 + 30 = 1/1 até 30/04 - 4 meses exatos (ano normal)

b) 31 + 29 + 31 + 29 = 1/1 até 29/04 - 3 meses e 29 dias (ano bissexto)

c ) 31 + 31 + 30 + 28 = 1/7 até 28/09 - 3 meses e 28 dias

E assim por diante.

Quando se envolve anos, como por exemplo, penas de 18 anos, 9 meses e 15 dias, como fará o cálculo? Esses 18 anos consideram quantos bissextos?

Sinceramente, você vai precisar considerar cada uma destas questões, a não ser que prefira fazer um software porco, pois, mês comercial não serve como base para cálculo penal e, ao ser anunciada a pena, não há como saber quando esta será iniciada, se já está sendo cumprida, quanto tempo se passou, etc.

Não querendo te desanimar, mas vai precisar de mais do que converter em dias para poder realizar este cálculo.

porem os juízes usam o mês comercial como base de calc, pois n importa se o ano vai ser b sexto , tem 30 ou 28 dias até pq qndo eh declarado 1 pena não se sabe quando ele vai começar a cumprir na verdade n sabe nem se vai cumprir, no livro de calc penal q vi ele usa o ano com 365 e mês como 30

Não tinha visto o comentário acima… acredito que o cálculo do drsmachado de certo…

boa sorte

novato25

testa isso

public class Main {

	private static final int NUMERO_DE_DIAS = 790;

	public static void main(String[] args) throws ParseException {

		Calendar data = Calendar.getInstance();
		data.add(Calendar.DATE, NUMERO_DE_DIAS);

		int contadorDeMeses = -1;
		int contadorDeAnos = -1;
		int contadorDeDias = 0;

		Calendar dataHoje = Calendar.getInstance();
		while(data.compareTo(dataHoje) >= 0) {
			dataHoje.add(Calendar.YEAR, 1);
			++contadorDeAnos;
		}

		if(contadorDeAnos > -1) {
			data.add(Calendar.YEAR, contadorDeAnos * (-1));
		}

		dataHoje = Calendar.getInstance();
		while(data.compareTo(dataHoje) >= 0) {
			dataHoje.add(Calendar.MONTH, 1);
			++contadorDeMeses;
		}
		
		if(contadorDeMeses > -1) {
			data.add(Calendar.MONTH, contadorDeMeses * (-1));
		}
		
		dataHoje = Calendar.getInstance();
		while(data.compareTo(dataHoje) > 0) {
			dataHoje.add(Calendar.DATE, 1);
			++contadorDeDias;
		}
		
		DateFormat.getInstance().format(Calendar.getInstance().getTime());
		SimpleDateFormat dataFormat = new SimpleDateFormat("dd/MM/yyyy"); 
		
		Calendar dataAtual = Calendar.getInstance();
		
		System.out.println("Data Inicial: " + dataFormat.format(dataAtual.getTime()));
		dataAtual.add(Calendar.DATE, NUMERO_DE_DIAS);
		System.out.println("Data Fim: " + dataFormat.format(dataAtual.getTime()) + " (após " + NUMERO_DE_DIAS + " dias da data Inicial)");		
		System.out.println("\nSão " + contadorDeAnos + " ano(s), " + contadorDeMeses + " mes(es) e " + contadorDeDias + " dia(s).");
	}

}
E
novato25:
testa isso
public class Main {

	private static final int NUMERO_DE_DIAS = 790;

	public static void main(String[] args) throws ParseException {

		Calendar data = Calendar.getInstance();
		data.add(Calendar.DATE, NUMERO_DE_DIAS);

		int contadorDeMeses = -1;
		int contadorDeAnos = -1;
		int contadorDeDias = 0;

		Calendar dataHoje = Calendar.getInstance();
		while(data.compareTo(dataHoje) >= 0) {
			dataHoje.add(Calendar.YEAR, 1);
			++contadorDeAnos;
		}

		if(contadorDeAnos > -1) {
			data.add(Calendar.YEAR, contadorDeAnos * (-1));
		}

		dataHoje = Calendar.getInstance();
		while(data.compareTo(dataHoje) >= 0) {
			dataHoje.add(Calendar.MONTH, 1);
			++contadorDeMeses;
		}
		
		if(contadorDeMeses > -1) {
			data.add(Calendar.MONTH, contadorDeMeses * (-1));
		}
		
		dataHoje = Calendar.getInstance();
		while(data.compareTo(dataHoje) > 0) {
			dataHoje.add(Calendar.DATE, 1);
			++contadorDeDias;
		}
		
		DateFormat.getInstance().format(Calendar.getInstance().getTime());
		SimpleDateFormat dataFormat = new SimpleDateFormat("dd/MM/yyyy"); 
		
		Calendar dataAtual = Calendar.getInstance();
		
		System.out.println("Data Inicial: " + dataFormat.format(dataAtual.getTime()));
		dataAtual.add(Calendar.DATE, NUMERO_DE_DIAS);
		System.out.println("Data Fim: " + dataFormat.format(dataAtual.getTime()) + " (após " + NUMERO_DE_DIAS + " dias da data Inicial)");		
		System.out.println("\nSão " + contadorDeAnos + " ano(s), " + contadorDeMeses + " mes(es) e " + contadorDeDias + " dia(s).");
	}

}
funcionou perfeitamente só q nunca usei o calendar n Tô entendendo vou da 1 estudada aq pra ver
E
novato25:
testa isso
public class Main {

	private static final int NUMERO_DE_DIAS = 790;

	public static void main(String[] args) throws ParseException {

		Calendar data = Calendar.getInstance();
		data.add(Calendar.DATE, NUMERO_DE_DIAS);

		int contadorDeMeses = -1;
		int contadorDeAnos = -1;
		int contadorDeDias = 0;

		Calendar dataHoje = Calendar.getInstance();
		while(data.compareTo(dataHoje) >= 0) {
			dataHoje.add(Calendar.YEAR, 1);
			++contadorDeAnos;
		}

		if(contadorDeAnos > -1) {
			data.add(Calendar.YEAR, contadorDeAnos * (-1));
		}

		dataHoje = Calendar.getInstance();
		while(data.compareTo(dataHoje) >= 0) {
			dataHoje.add(Calendar.MONTH, 1);
			++contadorDeMeses;
		}
		
		if(contadorDeMeses > -1) {
			data.add(Calendar.MONTH, contadorDeMeses * (-1));
		}
		
		dataHoje = Calendar.getInstance();
		while(data.compareTo(dataHoje) > 0) {
			dataHoje.add(Calendar.DATE, 1);
			++contadorDeDias;
		}
		
		DateFormat.getInstance().format(Calendar.getInstance().getTime());
		SimpleDateFormat dataFormat = new SimpleDateFormat("dd/MM/yyyy"); 
		
		Calendar dataAtual = Calendar.getInstance();
		
		System.out.println("Data Inicial: " + dataFormat.format(dataAtual.getTime()));
		dataAtual.add(Calendar.DATE, NUMERO_DE_DIAS);
		System.out.println("Data Fim: " + dataFormat.format(dataAtual.getTime()) + " (após " + NUMERO_DE_DIAS + " dias da data Inicial)");		
		System.out.println("\nSão " + contadorDeAnos + " ano(s), " + contadorDeMeses + " mes(es) e " + contadorDeDias + " dia(s).");
	}

}
ve ae se eu intendi oq foi feito 

Calendar data = Calendar.getInstance();
data.add(Calendar.DATE, NUMERO_DE_DIAS);
int contadorDeAnos = -1;

      Calendar dataHoje = Calendar.getInstance();  
        while(data.compareTo(dataHoje) >= 0) {  
            dataHoje.add(Calendar.YEAR, 1);  
            ++contadorDeAnos;  
        }  
  
        if(contadorDeAnos > -1) {  
            data.add(Calendar.YEAR, contadorDeAnos * (-1));  
        }
vc pegou a data de hoje e comparou com a data q somou os dias agora pq data.compareto(datahoje)>= 0 é maior q 0 e

pq se condeAnos >-1
vc add ele *-1 ?

novato25

na verdade, deveria ser contadorDeAnos > 0 (o mesmo se aplica para contadorDeMeses). Está funciona porque quando contadorDeAnos é igual a zero ele entra no if e soma zero dias [contadorDeAnos * (-1)]. O método add soma à data uma quantidade de tempo (conforme o primeiro parâmetro passado. No exemplo abaixo seria anos: Calendar.YEAR) . Quando o valor é negativo ele subtrai. então quando se faz
data.add(Calendar.YEAR, -1), a data está sendo decrementada em um ano.

E

novato25:
na verdade, deveria ser contadorDeAnos > 0 (o mesmo se aplica para contadorDeMeses). Está funciona porque quando contadorDeAnos é igual a zero ele entra no if e soma zero dias [contadorDeAnos * (-1)]. O método add soma à data uma quantidade de tempo (conforme o primeiro parâmetro passado. No exemplo abaixo seria anos: Calendar.YEAR) . Quando o valor é negativo ele subtrai. então quando se faz
data.add(Calendar.YEAR, -1), a data está sendo decrementada em um ano.

certo mais seu contadorDeAnos ele começa com -1 e o while só entra se for > 0 como ele entraria então ? mudaria o contador para 0?

novato25

na verdade, não… fiz assim porque ele sempre entra no loop em qualquer data maior que a data atual, mesmo que seja um dia. Quando ele entra no loop, ele incrementa o contador de de ano em um, ficando este com valor zero e acrescenta um ano a data atual. Vou refatorar o código e posto aqui.

E

por favor :roll:

J

Amigo… agora surgiu uma duvida aqui… eu achei muito interessante o algoritmo do amigo acima, mas implementaria diferente.
Resolvi implementar e acabou dando uma diferença de cálculo.

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

public class Dias {

	public static void main(String[] args) {
		
		int dias = 300;
		Date dataHoje = new Date();
		Calendar calendarioHoje = new GregorianCalendar();
		calendarioHoje.setTime(dataHoje);
		Calendar calendarioFim = new GregorianCalendar();
		calendarioFim.setTime(dataHoje);
		calendarioFim.add(Calendar.DATE, dias);
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		System.out.println(sdf.format(calendarioHoje.getTime()) + " - " + sdf.format(calendarioFim.getTime()));

		int qtdAnos = calendarioFim.get(Calendar.YEAR) - calendarioHoje.get(Calendar.YEAR);
		calendarioHoje.add(Calendar.YEAR, qtdAnos);
		if (calendarioHoje.after(calendarioFim)) {						
			qtdAnos--;
			calendarioHoje.add(Calendar.YEAR, -1);	
		}
		
		int qtdMeses = mesesEntre(calendarioHoje, calendarioFim);
		calendarioHoje.add(Calendar.MONTH, qtdMeses);
		if (calendarioHoje.after(calendarioFim)) {
			qtdMeses--;
			calendarioHoje.add(Calendar.MONTH, -1);
		}
		int qtdDias = diasEntre(calendarioHoje, calendarioFim);
		
		System.out.println(qtdAnos + " - " + qtdMeses + " - " + qtdDias);
		
		
		
	}
	
    public static int mesesEntre(Calendar hoje, Calendar fim){  
    	
    	Calendar cinicial = new GregorianCalendar();
    	Calendar cfinal = new GregorianCalendar();
    	cinicial.setTime(hoje.getTime());
    	cfinal.setTime(fim.getTime());
      
    	int count = 0;  
      
    	while (cinicial.get(Calendar.MONTH) != cfinal.get(Calendar.MONTH)
    			|| cinicial.get(Calendar.YEAR) != cfinal.get(Calendar.YEAR)){  
    		if (cinicial.after(cfinal)) {
    			cfinal.add(Calendar.MONTH, 1);
    		} else {
    			cfinal.add(Calendar.MONTH, -1);
    		}
    		count ++;  
    	}  
    	return count;  
    }  
    
    public static int diasEntre(Calendar hoje, Calendar fim){  
    	Calendar cinicial = new GregorianCalendar();
    	Calendar cfinal = new GregorianCalendar();
    	cinicial.setTime(hoje.getTime());
    	cfinal.setTime(fim.getTime());
      
    	int count = 0;  
      
    	while (!cinicial.equals(cfinal)){  
    		if (cinicial.after(cfinal)) {
    			cfinal.add(Calendar.DATE, 1);
    		} else {
    			cfinal.add(Calendar.DATE, -1);
    		}
    		count ++;  
    	}  
    	return count;  
    } 
}

Se considerarmos 300 dias, o algoritmo do amigo volta 9 meses e 27 dias.
O meu volta 9 meses e 24 dias.

Fazendo a conta “na unha”…

Hoje - 23/05 - Até 23/06 - 31 dias
Até 23/07 - 61 dias
Até 23/08 - 92 dias
Até 23/09 - 123 dias
Até 23/10 - 153 dias
Até 23/11 - 184 dias
Até 23/12 - 214 dias
Até 23/01 - 245 dias
Até 23/02 - 276 dias

300 dias - 276 dias = 24 dias!

E agora surgiu a duvida??? Qual dos 2 algoritmos esta errado?? Até que ponto a lógica do meu programa é mais correta?

Esta diferença parece estar acontecendo por causa do mês de fevereiro… Acredito que seja porque no algoritmo do amigo, ele pega a data final e vai diminuindo ano, depois mês, e depois dia, ou seja, ele diminui 28 dias de fevereiro, enquanto no meu caso eu vou aumentando a data (conforme a conta acima)… Fiquei na duvida agora. Qual caso seria efetivamente o mais correto ?

novato25

Código refatorado:

public class Main3 {
	
	private static final int NUMERO_DE_DIAS = 10;

	public static void main(String[] args) {
		int numeroDeMeses = 0;
		int numeroDeAnos = 0;
		int numeroDeDias = 0;

		Calendar data = obterDataAtual();
		adicionarDiasAhData(data, NUMERO_DE_DIAS);
		
		numeroDeAnos = obterAhQuantidadeDeAnos(data);
		subtrairNumeroDeAnosDaData(data, numeroDeAnos);

		numeroDeMeses = obterAhQuantidadeDeMeses(data);
		subtrairNumeroDeMeses(data, numeroDeMeses);
		
		numeroDeDias = obterNumeroDeDias(data);
		
		imprimirResultado(numeroDeMeses, numeroDeAnos, numeroDeDias);
	}

	private static int obterNumeroDeDias(Calendar data) {
		int numeroDeDias = 0;
		Calendar dataAtual = Calendar.getInstance();
		while(data.compareTo(dataAtual) > 0) {
			dataAtual.add(Calendar.DATE, 1);
			++numeroDeDias;
		}
		return numeroDeDias;
	}

	private static void subtrairNumeroDeMeses(Calendar data, int numeroDeMeses) {
		if(numeroDeMeses > 0) {
			data.add(Calendar.MONTH, numeroDeMeses * (-1));
		}
	}

	private static int obterAhQuantidadeDeMeses(Calendar data) {
		int numeroDeMeses = 0;
		Calendar dataAtual = Calendar.getInstance();
		dataAtual.add(Calendar.MONTH, 1);
		while(data.compareTo(dataAtual) >= 0) {
			++numeroDeMeses;
			dataAtual.add(Calendar.MONTH, 1);
		}
		return numeroDeMeses;
	}

	private static void adicionarDiasAhData(Calendar data, int numeroDeDias) {
		data.add(Calendar.DATE, numeroDeDias);
	}

	private static void subtrairNumeroDeAnosDaData(Calendar data, int numeroDeAnos) {
		data.add(Calendar.YEAR, numeroDeAnos * (-1));
	}

	private static int obterAhQuantidadeDeAnos(Calendar dataFinal) {
		Calendar dataAtual = obterDataAtual();
		dataAtual.add(Calendar.YEAR, 1); 
		int contadorDeAnos = 0;
		
		while(dataFinal.compareTo(dataAtual) >= 0) { 
			++contadorDeAnos;
			dataAtual.add(Calendar.YEAR, 1);
		}
		return contadorDeAnos;
	}

	private static Calendar obterDataAtual() {
		return Calendar.getInstance();
	}

	private static void imprimirResultado(int contadorDeMeses, int contadorDeAnos, int contadorDeDias) {
		SimpleDateFormat dataFormat = new SimpleDateFormat("dd/MM/yyyy"); 
		Calendar dataHoje = obterDataAtual();
		
		System.out.println("Data Inicial: " + dataFormat.format(dataHoje.getTime()));
		adicionarDiasAhData(dataHoje, NUMERO_DE_DIAS);
		System.out.println("Data Fim: " + dataFormat.format(dataHoje.getTime()) + " (após " + NUMERO_DE_DIAS + " dias da data Inicial)");		
		System.out.println("\nSão " + contadorDeAnos + " ano(s), " + contadorDeMeses + " mes(es) e " + contadorDeDias + " dia(s).");
	}

}
novato25

Realmente, o jmmenezes está certo. O número de dias do meu algoritimo está errado. Fiz a correção e acho que agora está certo. Segue implementação abaixo:

public class Main {
	
	private static final int NUMERO_DE_DIAS = 300;

	public static void main(String[] args) {
		int numeroDeMeses = 0;
		int numeroDeAnos = 0;
		int numeroDeDias = 0;

		Calendar data = obterDataAtual();
		adicionarDiasAhData(data, NUMERO_DE_DIAS);
		
		Calendar dataAtual = obterDataAtual();
		
		numeroDeAnos = obterAhQuantidadeDeAnos(data);
		somarNumeroDeAnosAhDataAtual(dataAtual, numeroDeAnos);

		numeroDeMeses = obterAhQuantidadeDeMeses(data, clonarData(dataAtual));
		System.out.println(dataAtual.getTime());
		somarNumeroDeMesesAhDataAtual(dataAtual, numeroDeMeses);
		System.out.println(dataAtual.getTime());
		
		numeroDeDias = obterNumeroDeDias(data, dataAtual);
		
		imprimirResultado(numeroDeMeses, numeroDeAnos, numeroDeDias);
	}

	private static Calendar clonarData(Calendar dataAtual) {
		return (Calendar) dataAtual.clone();
	}

	private static void somarNumeroDeMesesAhDataAtual(Calendar data,
			int numeroDeMeses) {
		if(numeroDeMeses > 0) {
			data.add(Calendar.MONTH, numeroDeMeses);
		}
	}
	
	private static void somarNumeroDeAnosAhDataAtual(Calendar data,
			int numeroDeAnos) {
		if(numeroDeAnos > 0) {
			data.add(Calendar.YEAR, numeroDeAnos);
		}
	}

	private static int obterNumeroDeDias(Calendar data, Calendar dataAtual) {
		int numeroDeDias = 0;
		while(data.compareTo(dataAtual) > 0) {
			dataAtual.add(Calendar.DATE, 1);
			++numeroDeDias;
		}
		return numeroDeDias;
	}

	private static int obterAhQuantidadeDeMeses(Calendar data, Calendar dataAtual) {
		int numeroDeMeses = 0;
		dataAtual.add(Calendar.MONTH, 1);
		while(data.compareTo(dataAtual) >= 0) {
			++numeroDeMeses;
			dataAtual.add(Calendar.MONTH, 1);
		}
		return numeroDeMeses;
	}

	private static void adicionarDiasAhData(Calendar data, int numeroDeDias) {
		data.add(Calendar.DATE, numeroDeDias);
	}
	
	private static int obterAhQuantidadeDeAnos(Calendar data) {
		Calendar dataAtual = obterDataAtual();
		dataAtual.add(Calendar.YEAR, 1); 
		int contadorDeAnos = 0;
		
		while(data.compareTo(dataAtual) >= 0) { 
			++contadorDeAnos;
			dataAtual.add(Calendar.YEAR, 1);
		}
		return contadorDeAnos;
	}

	private static Calendar obterDataAtual() {
		return Calendar.getInstance();
	}

	private static void imprimirResultado(int contadorDeMeses, int contadorDeAnos, int contadorDeDias) {
		SimpleDateFormat dataFormat = new SimpleDateFormat("dd/MM/yyyy"); 
		Calendar dataHoje = obterDataAtual();
		
		System.out.println("Data Inicial: " + dataFormat.format(dataHoje.getTime()));
		adicionarDiasAhData(dataHoje, NUMERO_DE_DIAS);
		System.out.println("Data Fim: " + dataFormat.format(dataHoje.getTime()) + " (após " + NUMERO_DE_DIAS + " dias da data Inicial)");		
		System.out.println("\nSão " + contadorDeAnos + " ano(s), " + contadorDeMeses + " mes(es) e " + contadorDeDias + " dia(s).");
	}

}
J

novato25:
Realmente, o jmmenezes está certo. O número de dias do meu algoritimo está errado. Fiz a correção e acho que agora está certo. Segue implementação abaixo:

Então amigo… levantei a questão se efetivamente esta correto, pois depende da lógica.
Eu vejo realmente que o mais correto é contar, os anos que passaram, os meses que passaram e quantos dias faltam para completar um mês completo…
Mas se for considerar mês = 30 dias… a lógica terá de ser diferente!

novato25

É exatamente isso que você disse. Para contar os dias o meu algoritmo estava utilizando o mês de junho ao invés de fevereiro. :wink:

E

ainda n entendi pq o data.compareTO(dataAtual)>= 0 :frowning:

E

Bom dia Tô precisando mais 1 vez da ajuda de v6 , vim aqui a um tempo atrás para fazer 1 conversão de numero Inteiro para dia Mês e anos, e vcs me ajudaram com isso só que dps eu vi q a conversão de inteiro n vai me ajudar e preciso fazer a conversão de valor Decimal para Dia, Mês e Anos vc podem me ajudar ?

ex: 25.666666667 meses para Dias, Meses e Anos

vlw pessoal espero que possam me ajudar Tô precisando mt

J

erivanrgj:
Bom dia Tô precisando mais 1 vez da ajuda de v6 , vim aqui a um tempo atrás para fazer 1 conversão de numero Inteiro para dia Mês e anos, e vcs me ajudaram com isso só que dps eu vi q a conversão de inteiro n vai me ajudar e preciso fazer a conversão de valor Decimal para Dia, Mês e Anos vc podem me ajudar ?

ex: 25.666666667 meses para Dias, Meses e Anos

vlw pessoal espero que possam me ajudar Tô precisando mt

Amigo, para fazer isso terá de fazer outro algoritmo, que calcule 0.666666667 sob. os dias do mês após passados 25 meses.
Vou ver se monto aqui…

E

jmmenezes:
erivanrgj:
Bom dia Tô precisando mais 1 vez da ajuda de v6 , vim aqui a um tempo atrás para fazer 1 conversão de numero Inteiro para dia Mês e anos, e vcs me ajudaram com isso só que dps eu vi q a conversão de inteiro n vai me ajudar e preciso fazer a conversão de valor Decimal para Dia, Mês e Anos vc podem me ajudar ?

ex: 25.666666667 meses para Dias, Meses e Anos

vlw pessoal espero que possam me ajudar Tô precisando mt

Amigo, para fazer isso terá de fazer outro algoritmo, que calcule 0.666666667 sob. os dias do mês após passados 25 meses.
Vou ver se monto aqui…


por favor eu agradeço

J

Amigo, a principio é só mudar o começo do algoritmo de forma que se calcule a quantidade de dias, baseado no mês, após adicionada a quantidade de meses.
O restante ficaria igual, pois é basicamente saber a quantidade de anos, meses e dias entre uma data (pois o decimal pode se tornar um mês completo).

Acredito que desta forma atenderia:

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

public class Dias {

	public static void main(String[] args) {

		double meses = 25.666666667;
		int qtdMesesTot = (int) meses;
		double restoMeses = meses - qtdMesesTot;
		
		Date dataHoje = new Date();
		Calendar calendarioHoje = new GregorianCalendar();
		calendarioHoje.setTime(dataHoje);
		Calendar calendarioFim = new GregorianCalendar();
		calendarioFim.setTime(dataHoje);
		calendarioFim.add(Calendar.MONTH, qtdMesesTot);

		// Agora temos de adicionar os dias, correspondentes ao mês
		int diasMes = calendarioFim.getActualMaximum(Calendar.DAY_OF_MONTH);
		int dias = (int) (((diasMes / 100d) * restoMeses) * 100d);
		calendarioFim.add(Calendar.DATE, dias);
				
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		System.out.println(sdf.format(calendarioHoje.getTime()) + " - " + sdf.format(calendarioFim.getTime()));

		int qtdAnos = calendarioFim.get(Calendar.YEAR) - calendarioHoje.get(Calendar.YEAR);
		calendarioHoje.add(Calendar.YEAR, qtdAnos);
		if (calendarioHoje.after(calendarioFim)) {						
			qtdAnos--;
			calendarioHoje.add(Calendar.YEAR, -1);	
		}
		
		int qtdMeses = mesesEntre(calendarioHoje, calendarioFim);
		calendarioHoje.add(Calendar.MONTH, qtdMeses);
		if (calendarioHoje.after(calendarioFim)) {
			qtdMeses--;
			calendarioHoje.add(Calendar.MONTH, -1);
		}
		int qtdDias = diasEntre(calendarioHoje, calendarioFim);
		
		System.out.println(qtdAnos + " - " + qtdMeses + " - " + qtdDias);
		
		
		
	}
	
    public static int mesesEntre(Calendar hoje, Calendar fim){  
    	
    	Calendar cinicial = new GregorianCalendar();
    	Calendar cfinal = new GregorianCalendar();
    	cinicial.setTime(hoje.getTime());
    	cfinal.setTime(fim.getTime());
      
    	int count = 0;  
      
    	while (cinicial.get(Calendar.MONTH) != cfinal.get(Calendar.MONTH)
    			|| cinicial.get(Calendar.YEAR) != cfinal.get(Calendar.YEAR)){  
    		if (cinicial.after(cfinal)) {
    			cfinal.add(Calendar.MONTH, 1);
    		} else {
    			cfinal.add(Calendar.MONTH, -1);
    		}
    		count ++;  
    	}  
    	return count;  
    }  
    
    public static int diasEntre(Calendar hoje, Calendar fim){  
    	Calendar cinicial = new GregorianCalendar();
    	Calendar cfinal = new GregorianCalendar();
    	cinicial.setTime(hoje.getTime());
    	cfinal.setTime(fim.getTime());
      
    	int count = 0;  
      
    	while (!cinicial.equals(cfinal)){  
    		if (cinicial.after(cfinal)) {
    			cfinal.add(Calendar.DATE, 1);
    		} else {
    			cfinal.add(Calendar.DATE, -1);
    		}
    		count ++;  
    	}  
    	return count;  
    } 
}
E

sei q eh pedir muito mais vc pode comentar os metodos pq eu to boiando =S

J

Amigo… segue o fonte todo comentado.
PS: Tem outras formas de fazer isso, até mesmo o algoritmo do amigo anterior… mas isso é outro detalhe.

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

public class Dias3 {

	public static void main(String[] args) {

		// Quantidade de meses
		double meses = 25.666666667;
		
		// Obtém apenas o valor inteiro de meses
		int qtdMesesTot = (int) meses;
		
		// Pega o restante (decimal de meses)
		double restoMeses = meses - qtdMesesTot;
		
		// Cria um objeto calendário com a data de hoje (do dia)
		Date dataHoje = new Date();
		Calendar calendarioHoje = new GregorianCalendar();
		calendarioHoje.setTime(dataHoje);
		
		// Cria um objeto calendário, também com a data de hoje, mas que será usado para a data final
		Calendar calendarioFim = new GregorianCalendar();
		calendarioFim.setTime(dataHoje);
		
		// Adiciona a quantidade inteira de meses na data final
		calendarioFim.add(Calendar.MONTH, qtdMesesTot);

		// Verifica quantos dias possui o mês da data final (após adicionada quantidade de meses)
		int diasMes = calendarioFim.getActualMaximum(Calendar.DAY_OF_MONTH);
		
		// Calcula quantos dias corresponde o decimal de meses, naquele mês
		int dias = (int) (((diasMes / 100d) * restoMeses) * 100d);
		
		// Adiciona esta quantidade de dias na data final
		calendarioFim.add(Calendar.DATE, dias);
				
		// Imprime as 2 datas (de hoje e adicionada a quantidade de meses informado com decimal)
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		System.out.println(sdf.format(calendarioHoje.getTime()) + " - " + sdf.format(calendarioFim.getTime()));

		// Subtrai os anos entre as datas para obter a quantidade de anos
		int qtdAnos = calendarioFim.get(Calendar.YEAR) - calendarioHoje.get(Calendar.YEAR);
		
		// Adiciona anos na data de hoje
		calendarioHoje.add(Calendar.YEAR, qtdAnos);
		
		// Caso tenha ultrapassado a data final, diminui 1 ano
		if (calendarioHoje.after(calendarioFim)) {						
			qtdAnos--;
			calendarioHoje.add(Calendar.YEAR, -1);	
		}
		
		// Calcula quantidade de meses (meses entre 2 datas com anos adicionados)
		int qtdMeses = mesesEntre(calendarioHoje, calendarioFim);
		
		// Adiciona meses na data de hoje
		calendarioHoje.add(Calendar.MONTH, qtdMeses);
		
		// Caso tenha ultrapassado a data final, diminui 1 mês
		if (calendarioHoje.after(calendarioFim)) {
			qtdMeses--;
			calendarioHoje.add(Calendar.MONTH, -1);
		}
		
		// Calcula quantidade de dias entre as 2 datas (dias entre 2 datas com anos e meses adicionados)
		int qtdDias = diasEntre(calendarioHoje, calendarioFim);
		
		System.out.println(qtdAnos + " - " + qtdMeses + " - " + qtdDias);
		
	}

	// Esta função calcula meses entre 2 datas
    public static int mesesEntre(Calendar hoje, Calendar fim){  
    	
    	Calendar cinicial = new GregorianCalendar();
    	Calendar cfinal = new GregorianCalendar();
    	cinicial.setTime(hoje.getTime());
    	cfinal.setTime(fim.getTime());
      
    	int count = 0;  
      
    	while (cinicial.get(Calendar.MONTH) != cfinal.get(Calendar.MONTH)
    			|| cinicial.get(Calendar.YEAR) != cfinal.get(Calendar.YEAR)){  
    		if (cinicial.after(cfinal)) {
    			cfinal.add(Calendar.MONTH, 1);
    		} else {
    			cfinal.add(Calendar.MONTH, -1);
    		}
    		count ++;  
    	}  
    	return count;  
    }  
    
    // Esta função calcula dias entre 2 datas
    public static int diasEntre(Calendar hoje, Calendar fim){  
    	Calendar cinicial = new GregorianCalendar();
    	Calendar cfinal = new GregorianCalendar();
    	cinicial.setTime(hoje.getTime());
    	cfinal.setTime(fim.getTime());
      
    	int count = 0;  
      
    	while (!cinicial.equals(cfinal)){  
    		if (cinicial.after(cfinal)) {
    			cfinal.add(Calendar.DATE, 1);
    		} else {
    			cfinal.add(Calendar.DATE, -1);
    		}
    		count ++;  
    	}  
    	return count;  
    } 
}
E
jmmenezes:
Amigo, a principio é só mudar o começo do algoritmo de forma que se calcule a quantidade de dias, baseado no mês, após adicionada a quantidade de meses. O restante ficaria igual, pois é basicamente saber a quantidade de anos, meses e dias entre uma data (pois o decimal pode se tornar um mês completo).

Acredito que desta forma atenderia:

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

public class Dias {

	public static void main(String[] args) {

		double meses = 25.666666667;
		int qtdMesesTot = (int) meses;
		double restoMeses = meses - qtdMesesTot;
		
		Date dataHoje = new Date();
		Calendar calendarioHoje = new GregorianCalendar();
		calendarioHoje.setTime(dataHoje);
		Calendar calendarioFim = new GregorianCalendar();
		calendarioFim.setTime(dataHoje);
		calendarioFim.add(Calendar.MONTH, qtdMesesTot);

		// Agora temos de adicionar os dias, correspondentes ao mês
		int diasMes = calendarioFim.getActualMaximum(Calendar.DAY_OF_MONTH);
		int dias = (int) (((diasMes / 100d) * restoMeses) * 100d);
		calendarioFim.add(Calendar.DATE, dias);
				
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		System.out.println(sdf.format(calendarioHoje.getTime()) + " - " + sdf.format(calendarioFim.getTime()));

		int qtdAnos = calendarioFim.get(Calendar.YEAR) - calendarioHoje.get(Calendar.YEAR);
		calendarioHoje.add(Calendar.YEAR, qtdAnos);
		if (calendarioHoje.after(calendarioFim)) {						
			qtdAnos--;
			calendarioHoje.add(Calendar.YEAR, -1);	
		}
		
		int qtdMeses = mesesEntre(calendarioHoje, calendarioFim);
		calendarioHoje.add(Calendar.MONTH, qtdMeses);
		if (calendarioHoje.after(calendarioFim)) {
			qtdMeses--;
			calendarioHoje.add(Calendar.MONTH, -1);
		}
		int qtdDias = diasEntre(calendarioHoje, calendarioFim);
		
		System.out.println(qtdAnos + " - " + qtdMeses + " - " + qtdDias);
		
		
		
	}
	
    public static int mesesEntre(Calendar hoje, Calendar fim){  
    	
    	Calendar cinicial = new GregorianCalendar();
    	Calendar cfinal = new GregorianCalendar();
    	cinicial.setTime(hoje.getTime());
    	cfinal.setTime(fim.getTime());
      
    	int count = 0;  
      
    	while (cinicial.get(Calendar.MONTH) != cfinal.get(Calendar.MONTH)
    			|| cinicial.get(Calendar.YEAR) != cfinal.get(Calendar.YEAR)){  
    		if (cinicial.after(cfinal)) {
    			cfinal.add(Calendar.MONTH, 1);
    		} else {
    			cfinal.add(Calendar.MONTH, -1);
    		}
    		count ++;  
    	}  
    	return count;  
    }  
    
    public static int diasEntre(Calendar hoje, Calendar fim){  
    	Calendar cinicial = new GregorianCalendar();
    	Calendar cfinal = new GregorianCalendar();
    	cinicial.setTime(hoje.getTime());
    	cfinal.setTime(fim.getTime());
      
    	int count = 0;  
      
    	while (!cinicial.equals(cfinal)){  
    		if (cinicial.after(cfinal)) {
    			cfinal.add(Calendar.DATE, 1);
    		} else {
    			cfinal.add(Calendar.DATE, -1);
    		}
    		count ++;  
    	}  
    	return count;  
    } 
}
não tô entendendo 2 coisas a primeira foi esses
// Agora temos de adicionar os dias, correspondentes ao mês  
        int diasMes = calendarioFim.getActualMaximum(Calendar.DAY_OF_MONTH);  
        int dias = (int) (((diasMes / 100d) * restoMeses) * 100d);  
        calendarioFim.add(Calendar.DATE, dias);
e a segunda eh pq esse calendarioHoje.after(cfim) qtd-- Calendar.MONTH, -1); o msm faz com os anos
if (calendarioHoje.after(calendarioFim)) {  
	    	            qtdMeses--;  
	    	            calendarioHoje.add(Calendar.MONTH, -1);  
	    	        }
porem no metodo entre vc faz diferente
while (cinicial.get(Calendar.MONTH) != cfinal.get(Calendar.MONTH)  
                || cinicial.get(Calendar.YEAR) != cfinal.get(Calendar.YEAR)){    
            if (cinicial.after(cfinal)) {  
                cfinal.add(Calendar.MONTH, 1);  
            } else {  
                cfinal.add(Calendar.MONTH, -1);

pode da 1 ajuda a entender isso ?

J

erivanrgj:

não tô entendendo 2 coisas a primeira foi esses

// Agora temos de adicionar os dias, correspondentes ao mês  
        int diasMes = calendarioFim.getActualMaximum(Calendar.DAY_OF_MONTH);  
        int dias = (int) (((diasMes / 100d) * restoMeses) * 100d);  
        calendarioFim.add(Calendar.DATE, dias);
e a segunda eh pq

esse

calendarioHoje.after(cfim)

qtd

Calendar.MONTH, -1);

o msm faz com os anos
if (calendarioHoje.after(calendarioFim)) {  
	    	            qtdMeses--;  
	    	            calendarioHoje.add(Calendar.MONTH, -1);  
	    	        }

porem no metodo entre vc faz diferente

while (cinicial.get(Calendar.MONTH) != cfinal.get(Calendar.MONTH)  
                || cinicial.get(Calendar.YEAR) != cfinal.get(Calendar.YEAR)){    
            if (cinicial.after(cfinal)) {  
                cfinal.add(Calendar.MONTH, 1);  
            } else {  
                cfinal.add(Calendar.MONTH, -1);

pode da 1 ajuda a entender isso ?

Vamos lá:
1-Você precisa saber quanto 0.66666667 ou o decimal passado corresponde em dias ao mês da data final.
Por exemplo, se a data final tem 30 ou 31 dias ou mesmo fevereiro com 28 ou 29, essa quantidade de dias poderá mudar.
Aquele é o cálculo (bem simples).

2-Estou verificando se após adicionar os anos, passou da data final, e então diminui 1 ano ou 1 mês. Já nos métodos, apenas se verifica se pertence ao mesmo mês e ano, para poder chegar a equivalência. São lógicas diferentes por isso a diferença.

E

jmmenezes:
erivanrgj:

não tô entendendo 2 coisas a primeira foi esses

// Agora temos de adicionar os dias, correspondentes ao mês  
        int diasMes = calendarioFim.getActualMaximum(Calendar.DAY_OF_MONTH);  
        int dias = (int) (((diasMes / 100d) * restoMeses) * 100d);  
        calendarioFim.add(Calendar.DATE, dias);
e a segunda eh pq

esse

calendarioHoje.after(cfim)

qtd

Calendar.MONTH, -1);

o msm faz com os anos
if (calendarioHoje.after(calendarioFim)) {  
	    	            qtdMeses--;  
	    	            calendarioHoje.add(Calendar.MONTH, -1);  
	    	        }

porem no metodo entre vc faz diferente

while (cinicial.get(Calendar.MONTH) != cfinal.get(Calendar.MONTH)  
                || cinicial.get(Calendar.YEAR) != cfinal.get(Calendar.YEAR)){    
            if (cinicial.after(cfinal)) {  
                cfinal.add(Calendar.MONTH, 1);  
            } else {  
                cfinal.add(Calendar.MONTH, -1);

pode da 1 ajuda a entender isso ?

Vamos lá:
1-Você precisa saber quanto 0.66666667 ou o decimal passado corresponde em dias ao mês da data final.
Por exemplo, se a data final tem 30 ou 31 dias ou mesmo fevereiro com 28 ou 29, essa quantidade de dias poderá mudar.
Aquele é o cálculo (bem simples).

2-Estou verificando se após adicionar os anos, passou da data final, e então diminui 1 ano ou 1 mês. Já nos métodos, apenas se verifica se pertence ao mesmo mês e ano, para poder chegar a equivalência. São lógicas diferentes por isso a diferença.


então se ele passar sempre vai ser 1 ano ?

J

erivanrgj:
jmmenezes:
erivanrgj:

não tô entendendo 2 coisas a primeira foi esses

// Agora temos de adicionar os dias, correspondentes ao mês  
        int diasMes = calendarioFim.getActualMaximum(Calendar.DAY_OF_MONTH);  
        int dias = (int) (((diasMes / 100d) * restoMeses) * 100d);  
        calendarioFim.add(Calendar.DATE, dias);
e a segunda eh pq

esse

calendarioHoje.after(cfim)

qtd

Calendar.MONTH, -1);

o msm faz com os anos
if (calendarioHoje.after(calendarioFim)) {  
	    	            qtdMeses--;  
	    	            calendarioHoje.add(Calendar.MONTH, -1);  
	    	        }

porem no metodo entre vc faz diferente

while (cinicial.get(Calendar.MONTH) != cfinal.get(Calendar.MONTH)  
                || cinicial.get(Calendar.YEAR) != cfinal.get(Calendar.YEAR)){    
            if (cinicial.after(cfinal)) {  
                cfinal.add(Calendar.MONTH, 1);  
            } else {  
                cfinal.add(Calendar.MONTH, -1);

pode da 1 ajuda a entender isso ?

Vamos lá:
1-Você precisa saber quanto 0.66666667 ou o decimal passado corresponde em dias ao mês da data final.
Por exemplo, se a data final tem 30 ou 31 dias ou mesmo fevereiro com 28 ou 29, essa quantidade de dias poderá mudar.
Aquele é o cálculo (bem simples).

2-Estou verificando se após adicionar os anos, passou da data final, e então diminui 1 ano ou 1 mês. Já nos métodos, apenas se verifica se pertence ao mesmo mês e ano, para poder chegar a equivalência. São lógicas diferentes por isso a diferença.


então se ele passar sempre vai ser 1 ano ?

Não… se ele passar ele diminui 1 ano… por exemplo, imagine que esta em novembro e tem de adicionar 15 meses… você vai parar em fevereiro de 2 anos depois… ou seja… a diferença é 2 anos… mas adicionando 2 anos na data original você vai para novembro, ou seja, passou da data final. Neste caso você deve diminuir 1 ano.
Da mesma forma que se não completar 1 ano interior, por exemplo novembro de 2012 + 3 meses = fevereiro de 2013… 2013 - 2012 = 1 ano, porém como não completou o ano inteiro deve diminuir um ano e serão 0 anos.

E

jmmenezes:
erivanrgj:
jmmenezes:
erivanrgj:

não tô entendendo 2 coisas a primeira foi esses

// Agora temos de adicionar os dias, correspondentes ao mês  
        int diasMes = calendarioFim.getActualMaximum(Calendar.DAY_OF_MONTH);  
        int dias = (int) (((diasMes / 100d) * restoMeses) * 100d);  
        calendarioFim.add(Calendar.DATE, dias);
e a segunda eh pq

esse

calendarioHoje.after(cfim)

qtd

Calendar.MONTH, -1);

o msm faz com os anos
if (calendarioHoje.after(calendarioFim)) {  
	    	            qtdMeses--;  
	    	            calendarioHoje.add(Calendar.MONTH, -1);  
	    	        }

porem no metodo entre vc faz diferente

while (cinicial.get(Calendar.MONTH) != cfinal.get(Calendar.MONTH)  
                || cinicial.get(Calendar.YEAR) != cfinal.get(Calendar.YEAR)){    
            if (cinicial.after(cfinal)) {  
                cfinal.add(Calendar.MONTH, 1);  
            } else {  
                cfinal.add(Calendar.MONTH, -1);

pode da 1 ajuda a entender isso ?

Vamos lá:
1-Você precisa saber quanto 0.66666667 ou o decimal passado corresponde em dias ao mês da data final.
Por exemplo, se a data final tem 30 ou 31 dias ou mesmo fevereiro com 28 ou 29, essa quantidade de dias poderá mudar.
Aquele é o cálculo (bem simples).

2-Estou verificando se após adicionar os anos, passou da data final, e então diminui 1 ano ou 1 mês. Já nos métodos, apenas se verifica se pertence ao mesmo mês e ano, para poder chegar a equivalência. São lógicas diferentes por isso a diferença.


então se ele passar sempre vai ser 1 ano ?

Não… se ele passar ele diminui 1 ano… por exemplo, imagine que esta em novembro e tem de adicionar 15 meses… você vai parar em fevereiro de 2 anos depois… ou seja… a diferença é 2 anos… mas adicionando 2 anos na data original você vai para novembro, ou seja, passou da data final. Neste caso você deve diminuir 1 ano.
Da mesma forma que se não completar 1 ano interior, por exemplo novembro de 2012 + 3 meses = fevereiro de 2013… 2013 - 2012 = 1 ano, porém como não completou o ano inteiro deve diminuir um ano e serão 0 anos.

E

jmmenezes:
erivanrgj:
jmmenezes:
erivanrgj:

não tô entendendo 2 coisas a primeira foi esses

// Agora temos de adicionar os dias, correspondentes ao mês  
        int diasMes = calendarioFim.getActualMaximum(Calendar.DAY_OF_MONTH);  
        int dias = (int) (((diasMes / 100d) * restoMeses) * 100d);  
        calendarioFim.add(Calendar.DATE, dias);
e a segunda eh pq

esse

calendarioHoje.after(cfim)

qtd

Calendar.MONTH, -1);

o msm faz com os anos
if (calendarioHoje.after(calendarioFim)) {  
	    	            qtdMeses--;  
	    	            calendarioHoje.add(Calendar.MONTH, -1);  
	    	        }

porem no metodo entre vc faz diferente

while (cinicial.get(Calendar.MONTH) != cfinal.get(Calendar.MONTH)  
                || cinicial.get(Calendar.YEAR) != cfinal.get(Calendar.YEAR)){    
            if (cinicial.after(cfinal)) {  
                cfinal.add(Calendar.MONTH, 1);  
            } else {  
                cfinal.add(Calendar.MONTH, -1);

pode da 1 ajuda a entender isso ?

Vamos lá:
1-Você precisa saber quanto 0.66666667 ou o decimal passado corresponde em dias ao mês da data final.
Por exemplo, se a data final tem 30 ou 31 dias ou mesmo fevereiro com 28 ou 29, essa quantidade de dias poderá mudar.
Aquele é o cálculo (bem simples).

2-Estou verificando se após adicionar os anos, passou da data final, e então diminui 1 ano ou 1 mês. Já nos métodos, apenas se verifica se pertence ao mesmo mês e ano, para poder chegar a equivalência. São lógicas diferentes por isso a diferença.


então se ele passar sempre vai ser 1 ano ?

Não… se ele passar ele diminui 1 ano… por exemplo, imagine que esta em novembro e tem de adicionar 15 meses… você vai parar em fevereiro de 2 anos depois… ou seja… a diferença é 2 anos… mas adicionando 2 anos na data original você vai para novembro, ou seja, passou da data final. Neste caso você deve diminuir 1 ano.
Da mesma forma que se não completar 1 ano interior, por exemplo novembro de 2012 + 3 meses = fevereiro de 2013… 2013 - 2012 = 1 ano, porém como não completou o ano inteiro deve diminuir um ano e serão 0 anos.

int dias = (int) (((diasMes / 100d) * restoMeses) * 100d); esse 100d eh do calendar

Criado 22 de maio de 2012
Ultima resposta 29 de mai. de 2012
Respostas 52
Participantes 7