[if/else] Adicionar um dia à uma data informada pelo usuário

Olá, boa noite a todos.

Estou fazendo um curso de Java, chegamos agora em condicionais, e uma das tarefas é a seguinte: criar um programa no qual o usuário informa uma data (expressa em dd/mm/aaaa) e deve ter, como retorno, o dia seguinte ao por ele informado. O problema: o professor não quer que usemos o pacote java.util.date ou similares, devemos resolver apenas com if/else. Além do mais, é preciso levar em conta que fevereiro tem 28 dias e que temos anos bissextos.

Eu até consegui fazer o programa funcionar sem levar em conta fevereiro e os anos bissextos, mas não tenho a mínima ideia de onde colocar essas duas informações no código para fazê-lo funcionar adequadamente.

Segue abaixo o que eu já fiz:

	Scanner entradaDeDados = new Scanner (System.in);
	
	System.out.println("Insira uma data (no formato DD/MM/AAAA)");
			
	System.out.println("Dia: ");
	int dia = entradaDeDados.nextInt();
	System.out.println("Mês: ");
	int mes = entradaDeDados.nextInt();
	System.out.println("Ano: ");
	int ano = entradaDeDados.nextInt();
	
	int novoDia = dia + 1;
	int novoMes = mes + 1;
	int novoAno = ano + 1;
	
	if (novoDia > 31) {
		mes = novoMes;
		novoDia = 01;
		if (novoMes > 12) {
			ano = novoAno;
			novoMes = 01;
			System.out.println(novoDia + "/" + novoMes + "/" + novoAno);
		} else
		System.out.println(novoDia + "/" + novoMes + "/" + ano);
	} else 			
	System.out.println(novoDia + "/" + mes + "/" + ano);
						
	entradaDeDados.close();
}

}

Seguem os testes e seus respectivos resultados:

  • Entrada 01/01/2000 resulta em 02/01/2000;
  • Entrada 31/01/2000 resulta em 01/02/2000;
  • Entrada 31/12/2000 resulta em 01/01/2001.

Agora eu preciso fazer a entrada 28/02/2002 resultar em 29/02/2002, e a entrada 28/02/2003 resultar em 01/03/2003, mas não consigo nem imaginar por onde começar.

Agradeço antecipadamente!

Olha o patinho de borracha funcionando!

Consegui achar uma resposta sozinho. Talvez não seja a mais elegante, mas funcionou:

if (((ano % 4 == 0) && (mes == 2) && (dia == 29)) || ((ano % 4 != 0) && (mes == 2) && (dia == 28))) {
mes = novoMes;
novoDia = 01;
System.out.println(novoDia + “/” + novoMes + “/” + ano);
} else if (novoDia > 31) {
mes = novoMes;
novoDia = 01;
if (novoMes > 12) {
ano = novoAno;
novoMes = 01;
System.out.println(novoDia + “/” + novoMes + “/” + novoAno);
} else
System.out.println(novoDia + “/” + novoMes + “/” + ano);
} else
System.out.println(novoDia + “/” + mes + “/” + ano);

Ainda assim, agradeço a quem por acaso venha a ler!

Curiosidade… que data é que a tua aplicação devolve se colocares, por exemplo, 30 de Setembro?

2002 não é ano bissexto, então o resultado deveria ser 01/03/2002.

Além disso, a regra é um pouco mais complicada: se o ano é múltiplo de 100, ele só é bissexto se também for múltiplo de 400 (ex: 2000 é bissexto, mas 1900 não).

E pra saber se mudou o mês, vc tem que verificar se passou do último dia, mas isso varia: nem todos os meses têm 31 dias.

Uma forma de fazer seria:

int proxDia = dia + 1, proxMes = mes, proxAno = ano;
int ultimoDia = 31; // último dia do mês atual 
switch(mes) {
    case 2:
        ultimoDia = (ano % 4 == 0) && (ano % 100 != 0 || ano % 400 == 0) ? 29 : 28;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        ultimoDia = 30;
}
// se passou o último dia do mês 
if (proxDia > ultimoDia) {
    proxDia = 1; // volta pro dia 1
    // avança o mês
    proxMes++;
    if (proxMes == 13) { // se era dezembro, avança pra janeiro do ano seguinte
        proxMes = 1;
        proxAno++;
    }
}

Lembrando que se for um exercício, tudo bem fazer na mão. Mas para aplicações sérias, prefira usar uma API de datas.

A partir do Java 8, use o java.time. No seu caso, uma alternativa é usar a classe java.time.LocalDate:

LocalDate data = LocalDate.of(ano, mes, dia);
LocalDate diaSeguinte = data.plusDays(1);

// se quiser pegar os valores separadamente 
int proxDia = diaSeguinte.getDayOfMonth();
int proxMes = diaSeguinte.getMonthValue();
int proxAno = diaSeguinte.getYear();
1 curtida