[RESOLVIDO] Ultimo dia do Mês Anterior

Boa tarde pessoal, estou com um problema, tenho um gerador de parcelas onde eu seleciono a periodicidade como dia Fixo, para gerar as parcelas todas no mesmo dia de meses diferentes. Porém quando seleciono por exemplo, Fevereiro: 29, 30 e 31, e os meses que não possuem 31 dias ele joga para o dia 1 do mês seguinte.

Preciso que o mesmo jogue a data para o ultimo dia do mês anterior.

if (valores.getSelectPeriodic().equals(Periodicidade.FIXO)){
	c.set(Calendar.MONTH, c.get(Calendar.MONTH) + 1);
}

Como posso fazer? Obrigado.

Boa tarde, o código abaixa retorna o ultimo dia do mês atual.
Não sei se te ajuda, mas…

Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);

Cara seria mais ou menos isso, porém fiz esses exemplos do link, mais não ficou correto…

Será algo assim

Calendar c = Calendar.getInstance(); // data atual
c.set(Calendar.DAY, 1); // Fazer set ao dia 1 para não ter problemas com dias 31 (ou 29-30 se Fev)
c.add(Calendar.MONTH, -1); // Ir para mes anterior
int ultimoDia = c.getActualMaximum(Calendar.DAY_OF_MONTH); //obter ultmo dia

Bom dia, eu utilizei esse getActualMaxium porém ele está pulando sozinho de 2 em 2 meses que é os meses que tem 31 dias… Já tentei subtrair um mês mais também não deu certo, ele trás os meses em ordem certa, porém todos com o dia 30, mesmo tendo alguns com dia 31

Tem ideia do que seja?

Como está o teu código?

Fiz como me disse.

if (valores.getSelectPeriodic().equals(Periodicidade.FIXO)){				
    int firstDate = c.get(Calendar.DAY_OF_MONTH);
    c.set(Calendar.MONTH, c.get(Calendar.MONTH) + 1);
	int dateFirstMonth = c.get(Calendar.DAY_OF_MONTH);
	if (firstDate > dateFirstMonth) {
        c.set(Calendar.DATE, 1); 
        c.add(Calendar.MONTH, -1);
		c.getActualMaximum(Calendar.DAY_OF_MONTH);
	}
}

A variável firstDate me retorna dia 31 e a dateFirstMonth me retorna dia 01. Sendo assim ele tem que me retornar o dia 31 ou 30 do mês anterior, certo? Porém ele me retorna todos os meses dia 30 mesmo tendo algum com dia 31.

Obs: Este código está em um laço que gera os meses de acordo com a quantidade de parcelas que eu informei, por isso eu cito vários meses.

Se tiver alguma outra ideia de como fazer, pode falar, obrigado.

A partir do momento que fazes o set month sem colocar o dia 1 corres o risco de ter o 31 (como dizes que tens)
Ao colocar o mes seguinte estás a passar para 31 de Abril (não existe e passa para 1 de Maio)

Sim, é isso que ocorre, como devo fazer?

Primeiro preciso de saber que lógica queres, se a data for 31 de Março, que datas queres que gere?

Se a primeira data for 31 de Março as outras devem gerar dia 31 para os meses que tem e 30 para os meses que não tem 31 dias. No caso de Fevereiro a mesma coisa. Deu para entender aonde quero chegar né? Deve antecipar a data e não pular para o dia 1 do próximo mês.

Exemplo:
1ª Data: 31/03
2ª Data: 30/04 (pois não tem 31 dias)
3ª Data: 31/05

E assim por diante.

No caso de Fevereiro:
1ª Data: 29/01
2ª Data: 28/02 (pois não tem 29 dias)
3ª Data: 29/03
4ª Data: 29/04

Mais fácil você verificar se o ano é bissexto e com isso setar os valores de data da forma de desejar.

Continuando a discussão do Ano bissexto:

O Teu problema é de lógica e de entender o código e não de Date ou Calendar

if (valores.getSelectPeriodic().equals(Periodicidade.FIXO)){				
    int firstDate = c.get(Calendar.DAY_OF_MONTH); // dia desejado
    c.set(Calendar.DATE, 1); // para não haver problemas com dias 31 
    c.add(Calendar.MONTH,  1); // Adiciona um mes
    int dateLastMonth = c.getActualMaximum(Calendar.DAY_OF_MONTH); // ultimo dia do mes 
    if (firstDate > dateLastMonth) { // se dia desejado é maior que ultimo dia do mes
      	c.set(Calendar.DAY_OF_MONTH, dateLastMonth); //set para o ultimo dia do mes
    } else {
          c.set(Calendar.DAY_OF_MONTH, firstDate); //Senao set para o dia desejado
    }
}
1 curtida

Ele me retornou o seguinte:

1ª Data: 31/03
2ª Data: 30/04 (pois não tem 31 dias)
3ª Data: 30/05 (Incorreto, pois esse mês tem 31 dias)
4ª Data: 30/06
5ª Data: 30/07
6ª Data: 30/08

Ele não difere o dia 31 do 30 repete o dia 30 para todos os outros meses, já estava acontecendo isso antes.

Mesmo caso para Fevereiro, repete o dia 28 para todos os meses.

O único mês que pode mudar de um ano para o outro é fevereiro.
Eu optaria de fazer a opção que daria um código maior mas funcionaria.
Eu fixaria todos os meses com seu ultimo dia com a exceção de fevereiro.
Em fevereiro eu verificaria se o ano é bissexto, se for fevereiro = 29 senão fevereiro = 28.

Eu sabia que isso ia acontecer, mas não consegues perceber porque?

Se tens dentro de um ciclo, isto tens de fazer antes desse ciclo e de começar a mexer na data:

 int firstDate = c.get(Calendar.DAY_OF_MONTH); // dia desejado

e obviamete retirar essa linha de dentro do if, sendo feita só uma vez

1 curtida

Muito obrigado, deu certo!!