Transformar String em Data

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");
}

Hugo,

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)

É que você digitou o ano com 2 dígitos (veja na mensagem de erro: “10/10/10”), mas o formato tem o ano com 4 dígitos.

Se quer que ele aceite somente o ano com 2 dígitos, troque para:

DateTimeFormatter formato = DateTimeFormatter.ofPattern("dd/MM/uu");

Ou, se quiser as 2 opções (o ano com 2 ou com 4 dígitos), aí use:

DateTimeFormatter formato = DateTimeFormatter.ofPattern("[dd/MM/uuuu][dd/MM/uu]");

Os colchetes ([ ]) indicam que o trecho é opcional, ou seja, eu posso ter o pattern com o ano com 4 dígitos, ou então com apenas 2 dígitos.

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. :smiley:

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

Não precisa criar exceção, basta capturar a já existente:

try {
    // coloque o código acima aqui...
} catch (DateTimeParseException e) {
    System.out.println("mensagem de erro");
}

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 Date nã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.

vou postar o código aqui de como ficou.

Mais uma vez obrigado pela ajuda :smiley:

Como você calculou a diferença em dias:

range = ChronoUnit.DAYS.between(hoje, data);

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
}