¿Cómo convierto la fecha de un formato a otro objeto de fecha en otro formato sin usar ninguna clase en desuso?

Me gustaría convertir una fecha en formato date1 a un objeto date en formato date2.

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMMM dd, yyyy"); SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyyMMdd"); Calendar cal = Calendar.getInstance(); cal.set(2012, 8, 21); Date date = cal.getTime(); Date date1 = simpleDateFormat.parse(date); Date date2 = simpleDateFormat.parse(date1); println date1 println date2 

Use SimpleDateFormat#format :

 DateFormat originalFormat = new SimpleDateFormat("MMMM dd, yyyy", Locale.ENGLISH); DateFormat targetFormat = new SimpleDateFormat("yyyyMMdd"); Date date = originalFormat.parse("August 21, 2012"); String formattedDate = targetFormat.format(date); // 20120821 

También tenga en cuenta que el parse toma un String , no un objeto Date , que ya está analizado .

tl; dr

 LocalDate.parse( "January 08, 2017" , DateTimeFormatter.ofPattern( "MMMM dd, uuuu" , Locale.US ) ).format( DateTimeFormatter.BASIC_ISO_DATE ) 

Usando java.time

La Pregunta y otras Respuestas usan clases problemáticas antiguas de fecha y hora, ahora heredadas, suplantadas por las clases de java.time.

Tiene valores solo de fecha, por lo tanto, use una clase de solo fecha. La clase LocalDate representa un valor de solo fecha sin hora del día y sin zona horaria.

 String input = "January 08, 2017"; Locale l = Locale.US ; DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMMM dd, uuuu" , l ); LocalDate ld = LocalDate.parse( input , f ); 

El formato de salida deseado está definido por la norma ISO 8601 . Para un valor de solo fecha, el formato “expandido” es AAAA-MM-DD como 2017-01-08 y el formato “básico” que minimiza el uso de delimitadores es AAAAMMDD como 20170108 .

Recomiendo utilizar el formato expandido para la legibilidad. Pero si insiste en el formato básico, ese formateador está predefinido como una constante en la clase DateTimeFormatter denominada BASIC_ISO_DATE .

 String output = ld.format( DateTimeFormatter.BASIC_ISO_DATE ); 

Vea este código ejecutado en vivo en IdeOne.com .

ld.toString (): 2017-01-08

salida: 20170108


Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas de fecha y hora como java.util.Date , Calendar y SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

¿Dónde obtener las clases de java.time?

  • Java SE 8 y SE 9 y posteriores
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) específicamente para Android.
    • Consulte Cómo utilizar ThreeTenABP ….

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y más .

Usando Java 8, podemos lograrlo de la siguiente manera:

 private static String convertDate(String strDate) { //for strdate = 2017 July 25 DateTimeFormatter f = new DateTimeFormatterBuilder().appendPattern("yyyy MMMM dd") .toFormatter(); LocalDate parsedDate = LocalDate.parse(strDate, f); DateTimeFormatter f2 = DateTimeFormatter.ofPattern("MM/d/yyyy"); String newDate = parsedDate.format(f2); return newDate; } 

La salida será: “25/07/2017”

Por favor, consulte el siguiente método. Toma su fecha String como argumento1, necesita especificar el formato existente de la fecha como argumento2 y el formato resultante (esperado) como argumento 3.

Consulte este enlace para comprender varios formatos: Formatos de fecha disponibles

 public static String formatDateFromOnetoAnother(String date,String givenformat,String resultformat) { String result = ""; SimpleDateFormat sdf; SimpleDateFormat sdf1; try { sdf = new SimpleDateFormat(givenformat); sdf1 = new SimpleDateFormat(resultformat); result = sdf1.format(sdf.parse(date)); } catch(Exception e) { e.printStackTrace(); return ""; } finally { sdf=null; sdf1=null; } return result; } 

Espero que esto ayude a alguien.

  public static String getDate( String date, String currentFormat, String expectedFormat) throws ParseException { // Validating if the supplied parameters is null if (date == null || currentFormat == null || expectedFormat == null ) { return null; } // Create SimpleDateFormat object with source string date format SimpleDateFormat sourceDateFormat = new SimpleDateFormat(currentFormat); // Parse the string into Date object Date dateObj = sourceDateFormat.parse(date); // Create SimpleDateFormat object with desired date format SimpleDateFormat desiredDateFormat = new SimpleDateFormat(expectedFormat); // Parse the date into another format return desiredDateFormat.format(dateObj).toString(); } 

Prueba esto

Esta es la forma más simple de cambiar un formato de fecha a otro

 public String changeDateFormatFromAnother(String date){ @SuppressLint("SimpleDateFormat") DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); @SuppressLint("SimpleDateFormat") DateFormat outputFormat = new SimpleDateFormat("dd MMMM yyyy"); String resultDate = ""; try { resultDate=outputFormat.format(inputFormat.parse(date)); } catch (ParseException e) { e.printStackTrace(); } return resultDate; } 
 import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; String fromDateFormat = "dd/MM/yyyy"; String fromdate = 15/03/2018; //Take any date String CheckFormat = "dd MMM yyyy";//take another format like dd/MMM/yyyy String dateStringFrom; Date DF = new Date(); try { //DateFormatdf = DateFormat.getDateInstance(DateFormat.SHORT); DateFormat FromDF = new SimpleDateFormat(fromDateFormat); FromDF.setLenient(false); // this is important! Date FromDate = FromDF.parse(fromdate); dateStringFrom = new SimpleDateFormat(CheckFormat).format(FromDate); DateFormat FromDF1 = new SimpleDateFormat(CheckFormat); DF=FromDF1.parse(dateStringFrom); System.out.println(dateStringFrom); } catch(Exception ex) { System.out.println("Date error"); } output:- 15/03/2018 15 Mar 2018 

Kotlin equivalente de respuesta respondida por João Silva

  fun getFormattedDate(originalFormat: SimpleDateFormat, targetFormat: SimpleDateFormat, inputDate: String): String { return targetFormat.format(originalFormat.parse(inputDate)) } 

Uso (en Android):

 getFormattedDate( SimpleDateFormat(FormatUtils.d_MM_yyyy, Locale.getDefault()), SimpleDateFormat(FormatUtils.d_MMM_yyyy, Locale.getDefault()), dateOfTreatment ) 

Nota: valores constantes:

 // 25 Nov 2017 val d_MMM_yyyy = "d MMM yyyy" // 25/10/2017 val d_MM_yyyy = "d/MM/yyyy" 
  //Convert input format 19-FEB-16 01.00.00.000000000 PM to 2016-02-19 01.00.000 PM SimpleDateFormat inFormat = new SimpleDateFormat("dd-MMM-yy hh.mm.ss.SSSSSSSSS aaa"); Date today = new Date(); Date d1 = inFormat.parse("19-FEB-16 01.00.00.000000000 PM"); SimpleDateFormat outFormat = new SimpleDateFormat("yyyy-MM-dd hh.mm.ss.SSS aaa"); System.out.println("Out date ="+outFormat.format(d1));