[Resolvido] Dúvida último dia do mês

Olá galera sempre venho ao GUJ matarar 99,100% das minhas dúvidas, mas dessa vez não teve jeito me deparei com um exercício relativamente simples, mas no qual não consigo chegar a uma solução…

O exercicio diz que tem se uma classe chamada TempoCurso com os seguintes atributos:

public class TempoCurso {
	
	private Date dataInicioCurso;
	private int tempoCurso;
	private Date dataMaxConclusaoCurso;
}

Onde a dataInicioCurso vai ser digitada pelo usuario, assim como o tempo do curso(em anos). O atributo dataMaxConclusaoCurso tem que ser o ultimo dia do mês informado na dataInicioCurso com o ano já calculado (dataInicioCurso + tempoCurso).

como um principiante na programação…cheguei a fazer “isto” para calcular dataMaxConclusaoCurso:


	public void calculoDataMaxConclusaoCurso(){
				
		Calendar c = new GregorianCalendar();
		c.add(Calendar.MONTH, (dataInicioCurso.getMonth() -1));
		
		dataMaxConclusaoCurso.setDate(c.getMaximum(c.DAY_OF_MONTH));
		dataMaxConclusaoCurso.setMonth(c.MONTH);
		dataMaxConclusaoCurso.setYear(dataInicioCurso.getYear() + tempoCurso);

	}

Bem além de não funcionar, isto está me cheirando a gambiarra :? . Usei GregorianCalendar porque pelo que eu vi a classe Date não ofereçe muitas opções para lidar com data, além dos getts…

Gostaria de saber se estou no caminho certo… :thumbup: ou se nem cheguei perto (como por exemplo o fato de parecer uma gambiarra).

E se tem alguma forma mais simples de calcular o ultimo dia do mês…

Desde já eu agradeço…

// data digitada pelo usuario
Date dataInicio = new Date();
// anos digitado pelo usuaio
int anos = 3;
		
GregorianCalendar dataFinal = new GregorianCalendar();
// copia a data digitada 
dataFinal.setTime(dataInicio);
// passa a data digitada para o ultimo dia do mes
dataFinal.set(GregorianCalendar.DAY_OF_MONTH, dataFinal.getMaximum(GregorianCalendar.DAY_OF_MONTH));
// adiciona a quantidade de anos
dataFinal.add(GregorianCalendar.YEAR, anos);		
// mostra a saida pra ver se funfou! hehehe
System.out.println(new java.util.Date(dataFinal.getTimeInMillis()));

[]'s

[quote=hamasu]Olá galera sempre venho ao GUJ matarar 99,100% das minhas dúvidas, mas dessa vez não teve jeito me deparei com um exercício relativamente simples, mas no qual não consigo chegar a uma solução…

O exercicio diz que tem se uma classe chamada TempoCurso com os seguintes atributos:

public class TempoCurso {
	
	private Date dataInicioCurso;
	private int tempoCurso;
	private Date dataMaxConclusaoCurso;
}

Onde a dataInicioCurso vai ser digitada pelo usuario, assim como o tempo do curso(em anos). O atributo dataMaxConclusaoCurso tem que ser o ultimo dia do mês informado na dataInicioCurso com o ano já calculado (dataInicioCurso + tempoCurso).

como um principiante na programação…cheguei a fazer “isto” para calcular dataMaxConclusaoCurso:


	public void calculoDataMaxConclusaoCurso(){
				
		Calendar c = new GregorianCalendar();
		c.add(Calendar.MONTH, (dataInicioCurso.getMonth() -1));
		
		dataMaxConclusaoCurso.setDate(c.getMaximum(c.DAY_OF_MONTH));
		dataMaxConclusaoCurso.setMonth(c.MONTH);
		dataMaxConclusaoCurso.setYear(dataInicioCurso.getYear() + tempoCurso);

	}

Bem além de não funcionar, isto está me cheirando a gambiarra :? . Usei GregorianCalendar porque pelo que eu vi a classe Date não ofereçe muitas opções para lidar com data, além dos getts…

Gostaria de saber se estou no caminho certo… :thumbup: ou se nem cheguei perto (como por exemplo o fato de parecer uma gambiarra).

E se tem alguma forma mais simples de calcular o ultimo dia do mês…

Desde já eu agradeço…[/quote]

Dois erros que eu vi ali:

1 - Tu fez c.DAY_OF_MONTH. Não é a referência ao calendar que faz acesso a esse valor, é a própria classe. Então, seria, Calendar.DAY_OF_MONTH
2 - Tu fez dataInicioCurso.getYear(). É um método depreciado, não use métodos depreciados. ali seria: c.get(Calendar.YEAR).

Quando você cria uma instancia de Calendar e seta um java.util.Date, ele automaticamente atualiza seus dados com a data informada, por isso, basta adicionar o ano que ele fará a soma automaticamente para você.

Vlw !!!

Eu fiz mais ou menos oq mauricioadl me mostrou e segui a sua dica nel…

Obrigado :thumbup:

Nossa, eu também estava precisando desse esclarecimento.

Valeu por criar o tópico e obrigado ao pessoal que ajudou!

Abraço!