LocalDate scaneado no formato BR - Qual é a opinião de vocês? Sou novo no Java

Eu vi conteúdos de você pode manipular do DateTime, mas só com exemplos com resultados prontos, sem interação com o usuário.

Tipo: Você digita a data num formato específico e já era “28/02/1997”, já consegue aceitar a data neste formato.

Portanto, o código ficou assim:

package blackboard;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.Scanner;


public class Main2 {
	public static void main(String[] args) {
			
			Scanner sc = new Scanner(System.in);  
			
			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy", new Locale("pt", "BR"));
			
			String dateString = sc.nextLine();
			
			LocalDate date = LocalDate.parse(dateString, formatter);
			
			System.out.println(date.format(formatter));
			sc.close();
	}
}

entrada - > "28/02/1997"
saída -> "28/02/1997"

Eu queria é saber a opinião de vocês, parece muito grande? tá muito exagerado, é assim mesmo? “Pode isso, Arnado”?

Não compreendi qual sua dúvida com este código, mas não vejo muita utilidade, a data no backend não precisa de formatação, isso é uma coisa que o frontend pode lidar tranquilamente.

Nesse caso específico não precisa do Locale.

O Locale faz diferença para informações como o nome do mês e dos dias da semana, ou para obter os formatos localizados.

Mas como no seu caso é um formato fixo somente com valores numéricos, não precisa do Locale.

Fora isso, também não entendi exatamente qual é a sua dúvida…

minha dúvida era se essa codificação procede, se não precisa ser tão grande assim, se tem algum excesso, etc … porque eu vi e conectei conteúdos espalhados pela Internet, eu arrisquei e precisava de uma segurança, por isso agradeço pela contribuição.

Depende do que você precisa fazer.

Você precisa criar um LocalDate? Pois esta classe possui vários métodos úteis para manipular datas (como somar dias, comparar com outras datas, pegar o dia da semana, etc), que você não teria se ficasse somente com a String. Se vai precisar deles, então precisa criar o LocalDate.

Um outro exemplo de uso é converter a data para outro formato:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String dateString = "30/04/2020";
LocalDate date = LocalDate.parse(dateString, formatter);

// outro formato
DateTimeFormatter outroFormato = DateTimeFormatter.ofPattern("dd 'de' MMMM 'de' uuuu", new Locale("pt", "BR"));
System.out.println(date.format(outroFormato)); // 30 de Abril de 2020

Outro ponto é que ao usar um DateTimeFormatter para fazer o parsing, você também está validando a data. Por exemplo, se fosse digitado “99/99/9999”, isso não é uma data válida (pois dia 99 do mês 99 não existe), então o uso do DateTimeFormatter juntamente com parse é uma ótima forma de validar. Claro que dá pra fazer isso na mão, mas se a API já te dá isso pronto, não há motivo para não usar (e entendo que validação dos dados geralmente é um ponto importante, e datas são mais complicadas do que parecem, por isso é melhor delegar para uma API especializada).


Só tem um detalhe: se você digitar uma data como “31/04/2020” (31 de abril, que é inválido, pois abril só tem 30 dias), o DateTimeFormatter ajusta automaticamente para 30 de abril.

Se quiser que ele valide também esses casos (em vez de fazer esse ajuste), basta mudá-lo para o modo STRICT, usando um java.time.format.ResolverStyle:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/uuuu")
    .withResolverStyle(ResolverStyle.STRICT);
String dateString = "31/04/2020";
try {
    LocalDate date = LocalDate.parse(dateString, formatter);
    System.out.println(date.format(formatter));
} catch (DateTimeParseException e) {
    System.out.println("Data inválida:" + e.getMessage());
}

Repare que usei “uuuu” em vez de “yyyy” para o ano. Para uma explicação mais detalhada sobre o motivo, veja aqui.

2 curtidas