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.