Estou tentando fazer um programa no qual o usuário vai inserir uma data e ela será comparada com a data atual.
Eu usei o scanner para pegar a informação do usuário, mas estou tendo dificuldade para transformar essa String no formato Date (para que eu possa depois compará-las usando o Millisegundo).
Eu tentei usar o SimpleDate Format e o LocalDateFormatter, mas em ambas tentativas tive erro. Abaixo coloco o código que fiz até o momento.
Desde já agradeço pela ajuda pessoa.
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class Exercicio02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//Calendar agora = Calendar.getInstance();
Date data = new Date();
System.out.printf("Data de hoje: %tD\n", data);
System.out.println("Insira a data da fatura: (dd/MM/yyyy) ");
Scanner entrada = new Scanner(System.in);
String dataCliente = entrada.nextLine();
System.out.println(dataCliente);
DateTimeFormatter formato = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate data1 = LocalDate.parse(dataCliente, formato);
System.out.println(formato.format(data1));
}
}
Se você está usando DateTimeFormatter (que pertence à API java.time), então não precisa misturar com java.util.Date (a API “antiga”/legada).
No seu caso, bastaria comparar o LocalDate com a data atual. Assim:
DateTimeFormatter formato = DateTimeFormatter.ofPattern("dd/MM/uuuu");
LocalDate hoje = LocalDate.now(); // data de hoje
// imprime a data de hoje no formato dia/mês/ano
System.out.println("Data de hoje: " + hoje.format(formato));
System.out.println("Insira a data da fatura: (dd/MM/yyyy) ");
Scanner entrada = new Scanner(System.in);
String dataCliente = entrada.nextLine();
LocalDate data = LocalDate.parse(dataCliente, formato);
// compara as datas
if (data.equals(hoje)) {
System.out.println("Data digitada é igual a data de hoje");
} else {
System.out.println("Data digitada é diferente da data de hoje");
}
Mesmo quando eu fiz as alterações que você sugeriu, eu ainda continuei recebendo a mesma mensagem de erro:
Exception in thread “main” java.time.format.DateTimeParseException: Text ‘10/10/10’ could not be parsed at index 6
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2051)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1953)
at java.base/java.time.LocalDate.parse(LocalDate.java:429)
at Exercicio02.main(Exercicio02.java:25)
Eu vi isso um pouco antes da sua resposta… Agora estou tentando ver uma forma de criar uma exceção (talvez uma exception) para mandar um erro para o usuário que cometer esse mesmo problema.
Pq não uma mensagem de erro no console? E depois um System.exit(1);
Ex.:
System.err.println(“Formato de data inválido, use dd/MM/yyyy”);
System.exit(1);
Bacana, a pergunta deve ser idiota, mas eu colocaria esse “try” antes de entrar no meu if, certo?
Aproveitando o espaço eu fiquei com outra dúvida:
Se eu quiser passar uma data para milissegundos quando eu utilizo LocalDate, basta usar “nome”.getTime();?
Bom, como é um exemplo simples, pode fazer o que eu já falei, e colocar todo o código dentro do try:
try {
DateTimeFormatter formato = DateTimeFormatter.ofPattern("[dd/MM/uuuu][dd/MM/uu]");
LocalDate hoje = LocalDate.now();
// imprime a data de hoje no formato dia/mês/ano
System.out.println("Data de hoje: " + hoje.format(formato));
System.out.println("Insira a data da fatura: (dd/MM/yyyy) ");
Scanner entrada = new Scanner(System.in);
String dataCliente = entrada.nextLine();
LocalDate data = LocalDate.parse(dataCliente, formato);
System.out.println(data);
if (data.equals(hoje)) {
System.out.println("Data digitada é igual a data de hoje");
} else {
System.out.println("Data digitada é diferente da data de hoje");
}
} catch (DateTimeParseException e) {
System.out.println("mensagem de erro");
}
Então, você sabe o que Date::getTime retorna? É um timestamp: a quantidade de milissegundos desde o Unix Epoch (1970-01-01T00:00Z - 1 de janeiro de 1970 à meia-noite em UTC).
O timestamp é um valor absoluto, no sentido de ser o mesmo no mundo todo (é o “agora”: nesse exato momento, em qualquer parte do mundo, o timestamp é o mesmo).
Mas um LocalDate é diferente: ele representa um valor específico de dia, mês e ano. Mas agora, em cada parte do mundo, pode ou não ser o mesmo dia (por causa dos fusos horários). Então converter de LocalDate para Datenão é tão simples (leia todas as respostas que tem neste link, porque a primeira é meio “simplista” - dependendo do horário e do timezone que você escolhe, o Date poderá ter um valor diferente).
Mas se você só quer comparar as datas, não precisa de nada disso, pode usar o LocalDate mesmo:
LocalDate hoje = LocalDate.now();
LocalDate data = // criar a data da forma que foi feito acima
if (data.isBefore(hoje)) {
System.out.println("Data está no passado");
} else if (data.isAfter(hoje)) {
System.out.println("Data está no futuro");
} else {
System.out.println("Datas são iguais");
}
@hugokotsuboConsegui fazer as alterações. Passei aqui para agradecer por toda a ajuda. Dei uma lida no que você falou e consegui pensar numa solução. Alias, depois da sua explicação, consegui entender muito mais claramente a diferença de uso entre as bibliotecas de Date, LocalDate e DateFormat.
Eu estava fazendo um exercício onde o cliente teria que colocar uma data de uma conta e caso a data fosse depois do dia de hoje, o app deveria dizer quantos dias faltariam para o cliente pagar.
Não precisaria usar equals ou isAfter. Bastaria fazer algo como:
if (range == 0) {
// data igual ao dia de hoje
} else if (range > 0) {
// data está no futuro, faltam "range" dias para pagar
} else {
// data está no passado
}