Como converter uma string para uma data usando SimpleDateFormat?

Eu tenho este trecho de código:

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

Quando eu corro isso, eu entendo isso como a saída:

 Sun Jan 16 00:10:00 IST 2011 

Eu esperava:

 Tue Aug 16 "Whatever Time" IST 2011 

Eu quero dizer que não estou recebendo o mês como esperado. Qual é o erro?

Tente isto:

 new SimpleDateFormat("MM/dd/yyyy") 
  • MM é “mês” (não mm )
  • dd é “dia” (não DD )

Está tudo no javadoc para SimpleDateFormat

FYI, a razão pela qual seu formato ainda é um formato de data válido é que:

  • mm é “minutos”
  • DD é “dia no ano”

Além disso, você não precisa do casting para Date … já é uma Date (ou explode):

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

Saída:

 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 a function abaixo

 /** * 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)); } 

O uso da amostra é o seguinte:

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

Exemplo muito simples é.

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

Você pode resolver o problema muito simples como Primeiro converter a string dada para o object de data, por exemplo:

 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 pedaço de código ajuda a converter para frente e para trás

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

Saída:

2011-08-16

Eu estou contribuindo com a resposta moderna. A resposta da Bohemian está correta e foi uma boa resposta quando foi escrita há 6 anos. Agora, a class SimpleDateFormat notoriamente problemática, está muito desatualizada e temos muito melhor em java.time , a moderna API de data e hora em Java. Eu recomendo vivamente que você use isso em vez das antigas classs de data e hora.

O que deu errado no seu código?

Quando eu analisar 08/16/2011 usando o seu snippet, recebo o Sun Jan 16 00:08:00 CET 2011 . Como minúsculos mm é para minutos, eu tenho 00:08:00 (8 minutos depois da meia-noite), e como DD maiúscula é para o dia do ano, eu recebo o dia 16 de janeiro.

Em java.time , as strings de padrão de formato também java.time maiúsculas e minúsculas e precisamos usar o MM maiúsculo para o mês e o minúsculo dd para o dia do mês.

Pergunta: Posso usar java.time com minha versão Java?

Sim, java.time funciona bem no Java 6 e posterior e em dispositivos Android mais antigos e mais recentes.

  • No Java 8 e posterior e em novos dispositivos Android (do nível 26 da API, me disseram), a API moderna vem incorporada.
  • No Java 6 e 7, obtenha o ThreeTen Backport, o backport das novas classs (ThreeTen for JSR 310; veja os links na parte inferior).
  • No (mais antigo) Android, use a edição Android do ThreeTen Backport. É chamado de ThreeTenABP. E certifique-se de importar as classs de data e hora do org.threeten.bp com subpacotes.

Links

  • Tutorial do Oracle: Date Time explicando como usar o java.time .
  • Java Specification Request (JSR) 310 , onde java.time foi descrito pela primeira vez.
  • Projeto ThreeTen Backport , o backport de java.time para Java 6 e 7 (ThreeTen for JSR-310).
  • ThreeTenABP , edição para Android do ThreeTen Backport
  • Pergunta: Como usar o ThreeTenABP no Projeto Android , com uma explicação muito completa.
 String localFormat = android.text.format.DateFormat.getBestDateTimePattern(Locale.getDefault(), "EEEE MMMM d"); return new SimpleDateFormat(localFormat, Locale.getDefault()).format(localMidnight); 

retornará um formato baseado no idioma do dispositivo. Note que getBestDateTimePattern () retorna “a melhor forma possível localizada do esqueleto dado para o local dado”

Você usou alguns erros de tipo . Se você quiser definir 08/16/2011 ao seguinte padrão. Está errado porque,

mm significa minutos , use MM como para meses

DD está errado , deve ser dd que representa Dias

Tente isto para alcançar o resultado que você deseja obter ( 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