Como faço para converter a data de um formato para outro object de data em outro formato sem usar classs obsoletas?

Gostaria de converter uma data no formato date1 para um object date no 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 o 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 

Observe também que a parse leva um String , não um object Date , que já é analisado .

tl; dr

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

Usando java.time

A pergunta e outras respostas usam classs de data e hora antigas problemáticas, agora legadas, suplantadas pelas classs java.time.

Você tem valores somente de datas, então use uma class somente de datas. A class LocalDate representa um valor somente de datas sem hora do dia e sem fuso horário.

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

O formato de saída desejado é definido pelo padrão ISO 8601 . Para um valor somente de data, o formato “expandido” é AAAA-MM-DD, como 2017-01-08 e o formato “básico”, que minimiza o uso de delimitadores, é AAAAMMDD, como 20170108 .

Eu sugiro fortemente usar o formato expandido para legibilidade. Mas se você insistir no formato básico, esse formatador é predefinido como uma constante na class DateTimeFormatter denominada BASIC_ISO_DATE .

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

Veja este código rodando ao vivo no IdeOne.com .

ld.toString (): 2017-01-08

produção: 20170108


Sobre o java.time

O framework java.time está embutido no Java 8 e posterior. Essas classs substituem as antigas classs herdadas de data e hora legadas , como java.util.Date , Calendar e SimpleDateFormat .

O projeto Joda-Time , agora em modo de manutenção , aconselha a migration para as classs java.time .

Para saber mais, veja o Oracle Tutorial . E pesquise o Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .

Onde obter as classs java.time?

  • Java SE 8 e SE 9 e posterior
    • Construídas em.
    • Parte da API Java padrão com uma implementação integrada.
    • O Java 9 adiciona alguns resources e correções menores.
  • Java SE 6 e SE 7
    • Grande parte da funcionalidade java.time é transferida para o Java 6 e 7 no ThreeTen-Backport .
  • Android
    • O projeto ThreeTenABP adapta o ThreeTen-Backport (mencionado acima) especificamente para o Android.
    • Veja Como usar o ThreeTenABP… .

O projeto ThreeTen-Extra estende java.time com classs adicionais. Este projeto é um campo de testes para possíveis futuras adições ao java.time. Você pode encontrar algumas classs úteis aqui como Interval , YearWeek , YearQuarter e muito mais .

Usando o Java 8, podemos conseguir isso da seguinte maneira:

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

A saída será: “25/07/2017”

Por favor, consulte o seguinte método. Ele pega a string de data como argument1, você precisa especificar o formato existente da data como argument2 e o formato de resultado (esperado) como argumento 3.

Consulte este link para entender vários formatos: Formatos de data disponíveis

 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 isso ajude alguém.

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

Tente isso

Esta é a maneira mais simples de alterar um formato de data para outro

 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 resposta respondida por João Silva

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

Uso (no 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));