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);
}
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
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.
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)
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
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ª 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.