¿Cómo convertir una cadena a una fecha usando SimpleDateFormat?

Tengo este fragmento de código:

DateFormat formatter1; formatter1 = new SimpleDateFormat("mm/DD/yyyy"); System.out.println((Date)formatter1.parse("08/16/2011")); 

Cuando ejecuto esto, obtengo esto como salida:

 Sun Jan 16 00:10:00 IST 2011 

Esperaba:

 Tue Aug 16 "Whatever Time" IST 2011 

Quiero decir que no estoy recibiendo el mes como esperaba. ¿Cuál es el error?

Prueba esto:

 new SimpleDateFormat("MM/dd/yyyy") 
  • MM es “mes” (no mm )
  • dd es “día” (no DD )

Todo está en javadoc para SimpleDateFormat

FYI, la razón por la cual su formato todavía es un formato de fecha válido es que:

  • mm es “minutos”
  • DD es “día en año”

Además, no necesita el lanzamiento hasta la Date … ya es una Date (o explota):

 public static void main(String[] args) throws ParseException { System.out.println(new SimpleDateFormat("MM/dd/yyyy").parse("08/16/2011")); } 

Salida:

 Tue Aug 16 00:00:00 EST 2011 

Voila!

m – min M – Meses

 Letter Date or Time Component Presentation Examples G Era designator Text AD y Year Year 1996; 96 M Month in year Month July; Jul; 07 w Week in year Number 27 W Week in month Number 2 D Day in year Number 189 d Day in month Number 10 F Day of week in month Number 2 E Day in week Text Tuesday; Tue a Am/pm marker Text PM H Hour in day (0-23) Number 0 k Hour in day (1-24) Number 24 K Hour in am/pm (0-11) Number 0 h Hour in am/pm (1-12) Number 12 m Minute in hour Number 30 s Second in minute Number 55 S Millisecond Number 978 z Time zone General time zone Pacific Standard Time; PST; GMT-08:00 Z Time zone RFC 822 time zone -0800 

Use la función a continuación

 /** * Format a time from a given format to given target format * * @param inputFormat * @param inputTimeStamp * @param outputFormat * @return * @throws ParseException */ private static String TimeStampConverter(final String inputFormat, String inputTimeStamp, final String outputFormat) throws ParseException { return new SimpleDateFormat(outputFormat).format(new SimpleDateFormat( inputFormat).parse(inputTimeStamp)); } 

El uso de la muestra es el siguiente:

  try { String inputTimeStamp = "08/16/2011"; final String inputFormat = "MM/dd/yyyy"; final String outputFormat = "EEE MMM dd HH:mm:ss z yyyy"; System.out.println(TimeStampConverter(inputFormat, inputTimeStamp, outputFormat)); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } 
 String newstr = "08/16/2011"; SimpleDateFormat format1 = new SimpleDateFormat("MM/dd/yyyy"); SimpleDateFormat format = new SimpleDateFormat("EE MMM dd hh:mm:ss z yyyy"); Calendar c = Calendar.getInstance(); c.setTime(format1.parse(newstr)); System.out.println(format.format(c.getTime())); 

El ejemplo muy simple es

 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy"); Date date = new Date(); Date date1 = new Date(); try { System.out.println("Date1: "+date1); System.out.println("date" + date); date = simpleDateFormat.parse("01-01-2013"); date1 = simpleDateFormat.parse("06-15-2013"); System.out.println("Date1 is:"+date1); System.out.println("date" + date); } catch (Exception e) { System.out.println(e.getMessage()); } 

puede resolver el problema de manera muy simple como Primero convierta la cadena dada al objeto de fecha, por ejemplo:

 java.util.Date date1 = new Date("11/19/2015"); SimpleDateFormat formatter = new SimpleDateFormat("MMM dd yyyy HH:mma"); String format = formatter.format(date); System.out.println(format); 

Este pedazo de código ayuda a convertir de ida y vuelta

  System.out.println("Date: "+ String.valueOf(new Date())); SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String stringdate = dt.format(new Date()); System.out.println("String.valueOf(date): "+stringdate); try { Date date = dt.parse(stringdate); System.out.println("parse date: "+ String.valueOf(date)); } catch (ParseException e) { e.printStackTrace(); } 
  DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MM/dd/uuuu"); System.out.println(LocalDate.parse("08/16/2011", dateFormatter)); 

Salida:

2011-08-16

Estoy contribuyendo con la respuesta moderna. La respuesta de Bohemian es correcta y fue una buena respuesta cuando fue escrita hace 6 años. Ahora, la clase SimpleDateFormat notoriamente problemática está obsoleta y tenemos mucho mejor en java.time , la moderna API de fecha y hora de Java. Recomiendo encarecidamente que use esto en lugar de las antiguas clases de fecha y hora.

¿Qué salió mal en tu código?

Cuando analizo 08/16/2011 con su fragmento, recibo Sun Jan 16 00:08:00 CET 2011 . Como el minúsculas mm es por minutos, obtengo 00:08:00 (8 minutos después de la medianoche), y como el DD mayúsculas es para el día del año, recibo el 16 de enero.

En java.time también las cadenas de patrones de formato son sensibles a las mayúsculas y minúsculas, y necesitábamos usar MM mayúscula para el mes y dd para el día del mes.

Pregunta: ¿Puedo usar java.time con mi versión de Java?

Sí, java.time funciona muy bien en Java 6 y versiones posteriores y en dispositivos Android más antiguos y nuevos.

  • En Java 8 y posteriores y en nuevos dispositivos Android (desde el nivel 26 de la API, me dicen) la API moderna viene incorporada.
  • En Java 6 y 7, obtenga el ThreeTen Backport, el backport de las nuevas clases (ThreeTen para JSR 310, vea los enlaces en la parte inferior).
  • En (más viejo) Android usa la edición Android de ThreeTen Backport. Se llama ThreeTenABP. Y asegúrese de importar las clases de fecha y hora desde org.threeten.bp con subpaquetes.

Campo de golf

  • Tutorial de Oracle: Fecha y hora explicando cómo usar java.time .
  • Solicitud de especificación de Java (JSR) 310 , donde java.time se describió por primera vez.
  • El proyecto ThreeTen Backport , el backport de java.time para Java 6 y 7 (ThreeTen for JSR-310).
  • ThreeTenABP , edición Android de ThreeTen Backport
  • Pregunta: Cómo usar ThreeTenABP en Android Project , con una explicación muy completa.
 String localFormat = android.text.format.DateFormat.getBestDateTimePattern(Locale.getDefault(), "EEEE MMMM d"); return new SimpleDateFormat(localFormat, Locale.getDefault()).format(localMidnight); 

devolverá un formato basado en el idioma del dispositivo. Tenga en cuenta que getBestDateTimePattern () devuelve “la mejor forma localizada posible del esqueleto dado para la configuración regional dada”

Usted ha usado algunos tipos de errores . Si desea establecer el 16/08/2011 en el siguiente patrón. Está mal porque,

mm significa minutos , usa MM tal como es por Meses

DD es incorrecto , debería ser dd que representa Días

Intente esto para lograr el resultado que desea obtener ( Tue Aug 16 "Whatever Time" IST 2011 ),

  String date = "08/16/2011"; //input date as String SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy"); // date pattern Date myDate = simpleDateFormat.parse(date); // returns date object System.out.println(myDate); //outputs: Tue Aug 16 00:00:00 IST 2011