Vencimento a partir de período (meses)

Pessoal, tenho dois campos: um contendo o periodo de vigencia do contrato (em meses) e outro campo contendo a data de início do contrato. Eu preciso que o próximo campo, término do contato seja gerado automaticamente. Como faço para executar esse calculo, sabendo que um campo está em MM e o outro em dd/MM/yyyy?

O código mais próximo que encontrei do que eu queria é este abaixo, porém há algum erro nele:

SimpleDateFormat sdf = new SimpleDateFormat(“dd/MM/yyyy”);
SimpleDateFormat sd = new SimpleDateFormat(“MM”);

Calendar data1 = Calendar.getInstance();
Calendar data2 = Calendar.getInstance();

try {

data1.setTime(sd.parse(txtVigencia.getText()));
data2.setTime(sdf.parse(txtInicio.getText()));

} catch (java.text.ParseException e ) {}

int vencimento = data2.get(Calendar.DATE) + data1.get(Calendar.DATE); txtTermino.setText(String.valueOf(vencimento));

Está usando qual versão do java?
Se for 8+, então mude de Calendar para LocalDate.
LocalDate permite operações muito simplificadas para este problema.

1 curtida

@naiconmartins bem vindo ao GUJ!

Ao postar código fonte, é ALTAMENTE RECOMENDADO que você utilize a ferramenta </>, na caixa de respostas, pois ele formata seu código fonte, deixando-o mais legível e de fácil interpretação. Veja a diferença:

SimpleDateFormat sdf = new SimpleDateFormat(“dd/MM/yyyy”);
SimpleDateFormat sd = new SimpleDateFormat(“MM”);

Calendar data1 = Calendar.getInstance();
Calendar data2 = Calendar.getInstance();

try {

data1.setTime(sd.parse(txtVigencia.getText()));
data2.setTime(sdf.parse(txtInicio.getText()));

} catch (java.text.ParseException e ) {}

int vencimento = data2.get(Calendar.DATE) + data1.get(Calendar.DATE); txtTermino.setText(String.valueOf(vencimento));

Compare com o seu agora e veja qual está mais legível :wink:

Para te ajudar ainda mais, dê uma lida nesse post aqui:

Java 8+

Tentei também com LocalDate e não consegui.

Meu problema é que o usuário irá informar os seguintes campos:
a) Vigência do contrato (exemplo 6 meses)
b) Início do contrato (exemplo 04/07/2019)

Eu quero que quando ele informar a data de início a aplicação calcule a data de término no contrato com base no período de vigência informado pelo usuário.

Se o período de vigência fosse fixo eu informaria isso no código e o calculo ocorreria. O que não estou conseguindo é fazer o código ler a informação do campo “vigência” e somar ao campo “inicio do contrato” para calcular o “termino do contrato”.

E o que não deu certo?

LocalDate ld = LocalDate.now(); //2019-07-04
ld.plusMonths(6);
System.out.println(ld); //2020-01-04

nesta linha:

ld.plusMonths(6);

Eu não quero informar o número pois ele não é fixo e depende do que for informado no campo. Se fosse fixo teria dado certo. Eu quero que ele pegue esse período de meses na JTextField e some com a data informada.

Você vai fazer dessa mesma forma, trocando o conteudo do parâmetro. Ao inves de passar um número, vai passar o período que o usuário inputou.

Só para esclarecer, você está estudando ou só fazendo de conta?
Por acaso sabe o que é um exemplo? Se sim, então, deixa de ser preguiçoso e faz o que precisa, seguindo o exemplo que coloquei.

Creio que você não tenha lido minha dúvida, tampouco entendido. Mas de qualquer forma, obrigado. Consegui o que eu queria, de forma diversa do que você sugeriu.
Segue o código com a solução do meu problema:

</>

int periodo = Integer.parseInt(txtVigencia.getText()); // captura o periodo em meses
int x = 0;

while (x < periodo){  
      
           String data = txtInicio.getText(); // captura a data de início do contrato 
           DateFormat df = new SimpleDateFormat("dd/MM/yyyy");    
          
      try {  
            
        Date date = df.parse(data);  

        int qtd = x; //Quantidade de meses que serão controlado pelo while   
   
        Calendar calendar = Calendar.getInstance();   

        calendar.setTime(date);      
         
        calendar.add(Calendar.MONTH, qtd); //faz a soma no mes baseado no valor de x   
            
        date = calendar.getTime();                     
              
        data = df.format(date);   
          
    } catch (ParseException e1) {  
          
        JOptionPane.showMessageDialog(null, "");              
    }    
        
x = x+1;  
  
if (x== Integer.parseInt(txtVigencia.getText())){  
      
    String dataFinal = data;  
    txtTermino.setText(dataFinal); //exibe a data de vencimento do contrato

}                                   
}

</>

Tanta linha para fazer exatamente o que o código que eu sugeri faz…