“EEE MMM dd HH: mm: ss ZZZ aaaa” formato de fecha a java.sql.Fecha

Estoy tratando de convertir EEE MMM dd HH:mm:ss ZZZ yyyy al YYYY-MM-DD , así que puedo insertarlo en una base de datos MySQL. No obtengo ningún error, pero la fecha insertada en mi db es incorrecta y lo mismo para cada fila …

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

Estoy usando las clases modernas en el paquete java.time . Observa que el código no solo es más simple, una vez que se familiariza con el estilo de escritura fluido de las clases más nuevas, también es más claro.

Si quisiera ser 100% moderno, también debería verificar si su último controlador MySQL JDBC no aceptaría un LocalDate directamente sin conversión a java.sql.Date . Debería.

Algunos detalles para notar

  • Si necesita que su código se ejecute en computadoras fuera de su control, proporcione siempre la configuración regional a su formateador, o la cadena de fecha no puede ser analizada en una computadora con una configuración regional que no sea de habla inglesa. Puede usar Locale.ROOT para una configuración regional neutral (habla inglés).
  • Si puede, evite las abreviaturas de tres zonas horarias. Muchos son ambiguos. EET es realmente solo la mitad de una zona horaria, ya que algunos lugares donde se usa ahora están en EEST (horario de verano). Es mejor utilizar una ID de zona horaria larga como Europe/Bucharest o una compensación de UTC como +02:00 .

Estos puntos son válidos sin importar si usa DateTimeFormatter o SimpleDateFormat .

Si no puede o no desea pasar a las clases más nuevas recomendadas, la solución a su código es:

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

Estoy usando zzz minúsculas ya que está documentado para que coincida con un nombre de zona horaria de tres letras, sé que ZZZ mayúsculas también funciona. He agregado locale. Y quizás lo más importante, en el formato necesario, he cambiado YYYY (año basado en la semana) a yyyy (año calendario) y DD (día del año) a dd (día del mes). Todas esas letras están en la documentación .