Cómo analizar una fecha?

Estoy tratando de analizar esta fecha con SimpleDateFormat y no está funcionando:

 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Formaterclass { public static void main(String[] args) throws ParseException{ String strDate = "Thu Jun 18 20:56:02 EDT 2009"; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); Date dateStr = formatter.parse(strDate); String formattedDate = formatter.format(dateStr); System.out.println("yyyy-MM-dd date is ==>"+formattedDate); Date date1 = formatter.parse(formattedDate); formatter = new SimpleDateFormat("dd-MMM-yyyy"); formattedDate = formatter.format(date1); System.out.println("dd-MMM-yyyy date is ==>"+formattedDate); } } 

Si pruebo este código con strDate = "2008-10-14" , tengo una respuesta positiva. ¿Cuál es el problema? ¿Cómo puedo analizar este formato?

PD. Recibí esta fecha de jDatePicker y no hay instrucciones sobre cómo modificar el formato de fecha que obtengo cuando el usuario elige una fecha.

No puede esperar analizar una fecha con un SimpleDateFormat configurado con un formato diferente.

Para analizar la cadena de fecha “Thu Jun 18 20:56:02 EDT 2009”, necesita un SimpleDateFormat como este (aproximadamente):

 SimpleDateFormat parser=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy"); 

Use esto para analizar la cadena en una Fecha, y luego en su otro SimpleDateFormat para convertir esa Fecha en el formato que desee.

  String input = "Thu Jun 18 20:56:02 EDT 2009"; SimpleDateFormat parser = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy"); Date date = parser.parse(input); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); String formattedDate = formatter.format(date); ... 

JavaDoc: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

El problema es que tienes una fecha formateada así:

 Thu Jun 18 20:56:02 EDT 2009 

Pero están usando un SimpleDateFormat que es:

 yyyy-MM-dd 

Los dos formatos no están de acuerdo. Necesita construir un SimpleDateFormat que coincida con el diseño de la cadena que está tratando de analizar en una Fecha. Alineando las cosas para que sea más fácil de ver, quiere un SimpleDateFormat como este:

 EEE MMM dd HH:mm:ss zzz yyyy Thu Jun 18 20:56:02 EDT 2009 

Verifique la página de JavaDoc a la que me he vinculado y vea cómo se usan los caracteres.

Ahora tenemos una forma más moderna de hacer este trabajo.

java.time

El marco java.time se incluye con Java 8 y posterior. Ver Tutorial . Estas nuevas clases están inspiradas en Joda-Time , definidas por JSR 310 , y ampliadas por el proyecto ThreeTen-Extra . Son una gran mejora sobre las antiguas clases problemáticas, java.util.Date/.Calendar et al.

Tenga en cuenta que los códigos de 3-4 letras como EDT no están estandarizados ni son únicos. Evítalos siempre que sea posible. Aprenda a usar formatos estándar ISO 8601 en su lugar. El marco java.time puede dar un paso en la traducción, pero muchos de los códigos comúnmente utilizados tienen valores duplicados.

Por cierto, tenga en cuenta cómo java.time por defecto genera cadenas usando los formatos ISO 8601, pero se extiende al agregar el nombre de la zona horaria entre corchetes.

 String input = "Thu Jun 18 20:56:02 EDT 2009"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM d HH:mm:ss zzz yyyy" , Locale.ENGLISH ); ZonedDateTime zdt = formatter.parse ( input , ZonedDateTime :: from ); 

Volcado a la consola.

 System.out.println ( "zdt : " + zdt ); 

Cuando se ejecuta.

zdt: 2009-06-18T20: 56: 02-04: 00 [America / New_York]

Ajustar zona horaria

Para divertirnos, ajustanos a la zona horaria de India.

 ZonedDateTime zdtKolkata = zdt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) ); 

zdtKolkata: 2009-06-19T06: 26: 02 + 05: 30 [Asia / Kolkata]

Convertir a juDate

Si realmente necesita un objeto java.util.Date para usar con clases que aún no se han actualizado a los tipos java.time, conviértalo. Tenga en cuenta que está perdiendo la zona horaria asignada, pero tiene el mismo momento ajustado automáticamente a UTC .

 java.util.Date date = java.util.Date.from( zdt.toInstant() ); 

¿Qué tal getSelectedDate ? De todos modos, específicamente en su pregunta de código, el problema es con esta línea:

 new SimpleDateFormat("yyyy-MM-dd"); 

La cadena que va en el constructor tiene que coincidir con el formato de la fecha. La documentación de cómo hacer eso está aquí . Parece que necesitas algo parecido a “EEE MMM d HH: mm: ss zzz yyyy”

En respuesta a: ” Cómo convertir Tue 13 de septiembre de 2016 00:00:00 GMT-0500 (Hora de verano central (México)) a dd-MM-aa en Java? “, Se marcó cómo duplicar

Pruebe esto: con java.util.Date , java.text.SimpleDateFormat , es una solución simple.

 public static void main(String[] args) throws ParseException { String fecha = "Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México))"; Date f = new Date(fecha); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); sdf.setTimeZone(TimeZone.getTimeZone("-5GMT")); fecha = sdf.format(f); System.out.println(fecha); }