Unparseable date: "Tue Apr 05 00:00:00 BRT 2022

Pessoal, estou com dificuldade ao tentar formatar uma data que recebo como parâmetro de uma request. Usando o método abaixo, recebo o seguinte erro: Unparseable date: "Tue Apr 05 00:00:00 BRT 2022"

	public Date pegarDataInicial() throws ParseException {
		String inicial = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("inicial");
		SimpleDateFormat formatar = new SimpleDateFormat("dd/MM/yyyy");
		Date data = formatar.parse(inicial);
		return data;
	}

Ao fazer o parsing, vc tem que indicar o formato no qual a string está. E ela não está no formato dd/MM/yyyy - inclusive, a mensagem de erro diz qual a string.

Portanto, basta usar o mesmo formato:

String inicial = "Tue Apr 05 00:00:00 BRT 2022";
SimpleDateFormat formatar = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
Date data = formatar.parse(inicial);

Também setei o java.util.Locale, pois o nome do mês e dia da semana estão em inglês. Sem indicar o locale, ele usa o que estiver configurado na JVM, e pode não ser inglês. Mas se vc já sabe como está a string, é mais garantido setar o locale correto.

1 curtida

Voce vai ter que fazer com o colega ja mensionou. informar o padrao de data que contem essa string so assim voce conseguirar transformar em data. Uma outra abordagem seria usar a api de datas “nova” do java.

LocalDate data = LocalDate.parse(inicial, DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z yyyy"));

O nome correto do método é ofPattern, e não of (que por sinal, nem existe).

Ainda sim, é preciso setar o locale, senão ele pode ou não funcionar, dependendo do que estiver configurado como default na JVM.

Por exemplo, testei com uma JVM configurada com o locale “pt_BR” (português brasileiro), e dá erro porque o nome do mês e dia da semana estão em inglês. Segundo a documentação do método ofPattern, ele usa o default FORMAT locale, que você pode ver qual é com System.out.println(Locale.getDefault(Locale.Category.FORMAT)) (na minha JVM, o resultado foi pt_BR, que corresponde ao português brasileiro, por isso dá erro ao fazer parsing de nomes em inglês).

Como essa é uma configuração do ambiente, que pode variar e nem sempre você tem controle sobre isso, o ideal é setar o locale correto (afinal, neste caso sabemos que os nomes estão em inglês, então podemos colocar esta informação diretamente no DateTimeFormatter):

String inicial = "Tue Apr 05 00:00:00 BRT 2022";
LocalDate data = LocalDate.parse(inicial, DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z yyyy", Locale.US));
System.out.println(data);

Aí sim funciona independente do locale default que estiver configurado na JVM.


PS: antes que alguém sugira usar Locale.setDefault, um aviso: apesar de também “funcionar”, o problema deste método é que ele muda o locale default para toda a JVM. Ou seja, outras aplicações rodando na mesma JVM também serão afetadas (caso elas estejam usando qualquer código que dependa desta configuração). Por isso eu acho melhor usar o locale correto diretamente nos objetos que precisam, cada um com o seu, sem precisar alterar o default de toda a JVM.

Sim sim, foi erro de digitacao minha pq fui fazendo fora da ide. acabei nao colocando o pattern. vou editar.

eu uso mais spring-boot ai eu passo dentro do application.properties

spring.jackson.time-zone=Brazil/East
spring.jackson.locale=pt-BR

e tambem crio as classes formatadoras. ai nem me preocupo muito. pq eu so passo o pattern que vem e ele se resolve