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.
Cara seria mais ou menos isso, porém fiz esses exemplos do link, mais não ficou correto…
P
pmlm
Será algo assim
Calendarc=Calendar.getInstance();// data atualc.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 anteriorintultimoDia=c.getActualMaximum(Calendar.DAY_OF_MONTH);//obter ultmo dia
L
luisfernandorf
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
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.
L
luisfernandorf
Se tiver alguma outra ideia de como fazer, pode falar, obrigado.
P
pmlm
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)
L
luisfernandorf
Sim, é isso que ocorre, como devo fazer?
P
pmlm
Primeiro preciso de saber que lógica queres, se a data for 31 de Março, que datas queres que gere?
L
luisfernandorf
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
V
Vinicius_Salles
Mais fácil você verificar se o ano é bissexto e com isso setar os valores de data da forma de desejar.
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)){intfirstDate=c.get(Calendar.DAY_OF_MONTH);// dia desejadoc.set(Calendar.DATE,1);// para não haver problemas com dias 31 c.add(Calendar.MONTH,1);// Adiciona um mesintdateLastMonth=c.getActualMaximum(Calendar.DAY_OF_MONTH);// ultimo dia do mes if(firstDate>dateLastMonth){// se dia desejado é maior que ultimo dia do mesc.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}}
L
luisfernandorf
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.
V
Vinicius_Salles
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.
P
pmlm1 like
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:
intfirstDate=c.get(Calendar.DAY_OF_MONTH);// dia desejado
e obviamete retirar essa linha de dentro do if, sendo feita só uma vez