LocalDate date4 = ZonedDateTime
.parse(date, DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH))
.toLocalDate();
java.sql.Date date5 = java.sql.Date.valueOf(date4);
Estou usando as classes modernas no
java.time
pacote. Você percebe que o código não é apenas mais simples, uma vez que você se familiariza com o estilo de escrita fluente das classes mais novas, também fica mais claro. Se você queria ser 100% moderno, você também deve verificar se o seu driver MySQL JDBC mais recente não aceitaria um
LocalDate
diretamente sem conversão para java.sql.Date
. Deveria. Alguns detalhes a serem observados
- Se você precisar que seu código seja executado em computadores fora de seu controle, sempre forneça a localidade ao seu formatador ou sua string de data não poderá ser analisada em um computador com uma localidade que não fale inglês. Você pode usar
Locale.ROOT
para uma localidade neutra (fala inglês). - Se puder, evite as abreviações de fuso horário de três letras. Muitos são ambíguos. EET é realmente apenas meio fuso horário, já que alguns lugares onde é usado estão no EEST (horário de verão) agora. É melhor usar um ID de fuso horário longo, como
Europe/Bucharest
ou um deslocamento do UTC como+02:00
.
Esses pontos são válidos independentemente de você usar
DateTimeFormatter
ou SimpleDateFormat
. Se você não puder ou não quiser passar para as classes mais recentes recomendadas, a correção para seu código é:
SimpleDateFormat formatnow
= new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
SimpleDateFormat formatneeded = new SimpleDateFormat("yyyy-MM-dd");
Estou usando
zzz
em minúsculas como isso está documentado para corresponder a um nome de fuso horário de três letras, sei que ZZZ
em maiúsculas funciona também. Eu adicionei localidade. E talvez o mais importante, alterei no formato necessário YYYY
(ano baseado na semana) para yyyy
(ano civil) e DD
(dia do ano) para dd
(dia do mês). Todas essas cartas estão na documentação
.