Formato de data “EEE MMM dd HH: mm: ss ZZZ aaaa” para java.sql.Date



mysql (1)

Eu estou tentando converter EEE MMM dd HH:mm:ss ZZZ yyyy para o YYYY-MM-DD , para que eu possa inseri-lo em um banco de dados MySQL. Eu não recebo nenhum erro, mas a data inserida no meu banco de dados está errada e é a mesma para todas as linhas ...

 String date = Sat Mar 04 09:54:20 EET 2017;
 SimpleDateFormat formatnow = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy"); 
 SimpleDateFormat formatneeded=new SimpleDateFormat("YYYY-MM-DD");

 java.util.Date date1 = (java.util.Date)formatnow.parse(date);
 String date2 = formatneeded.format(date1);
 java.util.Date date3= (java.util.Date)formatneeded.parse(date2);


 java.sql.Date sqlDate = new java.sql.Date( date3.getTime() );
 pst.setDate(1, sqlDate);

    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);

Eu estou usando as classes modernas no pacote java.time . Você percebe que o código não é apenas mais simples: assim que você se familiariza com o estilo de escrita fluente das classes mais novas, também fica mais claro.

Se você quisesse ser 100% moderno, você também deveria verificar se seu driver JDBC MySQL 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 o código do idioma ao formatador ou a sequência de datas não poderá ser analisada em um computador com um código do idioma que não fala inglês. Você pode usar o Locale.ROOT para um locale neutral (ele fala inglês).
  • Se puder, evite as abreviações de três fusos horários. Muitos são ambíguos. O EET é na verdade apenas metade do fuso horário, já que alguns lugares onde ele é 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 de UTC como +02:00 .

Esses pontos são válidos, não importa se você usa DateTimeFormatter ou SimpleDateFormat .

Se você não puder ou não quiser seguir para as classes mais novas recomendadas, a correção para o seu código é:

    SimpleDateFormat formatnow 
            = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH); 
    SimpleDateFormat formatneeded = new SimpleDateFormat("yyyy-MM-dd");

Eu estou usando zzz minúsculas desde que isso é documentado para coincidir com um nome de fuso horário de três letras, eu sei que funciona ZZZ maiúscula também. Eu adicionei locale. E talvez mais importante, no formato necessário eu mudei YYYY (ano baseado na semana) para yyyy (ano calendário) e DD (dia do ano) para dd (dia do mês). Todas essas cartas estão na documentação .





date