Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

EEE MMM dd HH:mm:ss ZZZ yyyy formato de data para java.sql.Date

    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 .