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.
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();