Como converter uma string de data em um object Date ou Calendar?

Eu tenho uma representação de String de uma data que eu preciso criar um object de Date ou Calendar de. Calendar APIs de Date e Calendar mas não encontrei nada que pudesse fazer isso além de criar meu próprio método de análise feia. Eu sei que deve haver uma maneira, alguém sabe de uma solução?

Em resumo:

 DateFormat formatter = new SimpleDateFormat("MM/dd/yy"); try { Date date = formatter.parse("01/29/02"); } catch (ParseException e) { e.printStackTrace(); } 

Veja SimpleDateFormat javadoc para mais.

E para transformá-lo em um Calendar , faça:

 Calendar calendar = Calendar.getInstance(); calendar.setTime(date); 

tl; dr

 LocalDate.parse( "2015-01-02" ) 

java.time

O Java 8 e versões posteriores têm uma nova estrutura java.time que torna essas outras respostas fora de moda. Este framework é inspirado no Joda-Time , definido pela JSR 310 , e ampliado pelo projeto ThreeTen-Extra . Veja o tutorial .

As antigas classs empacotadas, java.util.Date/.Calendar, são notoriamente problemáticas e confusas. Evite-os.

LocalDate

Como o Joda-Time, java.time tem uma class LocalDate para representar um valor somente de data sem hora do dia e sem fuso horário.

ISO 8601

Se sua string de input estiver no formato ISO 8601 padrão de yyyy-MM-dd , você poderá solicitar que essa class analise diretamente a string sem a necessidade de especificar um formatador.

Os formatos ISO 8601 são usados ​​por padrão em java.time, para analisar e gerar representações de string de valores de data e hora.

 LocalDate localDate = LocalDate.parse( "2015-01-02" ); 

Formatador

Se você tiver um formato diferente, especifique um formatador no pacote java.time.format . Você pode especificar seu próprio padrão de formatação ou permitir que o java.time localize automaticamente, conforme apropriado, a um Locale especifique uma linguagem humana para tradução e normas culturais para decidir problemas como período versus vírgula.

Padrão de formatação

Leia o documento de class DateTimeFormatter para obter detalhes sobre os códigos usados ​​no padrão de formato. Eles variam um pouco dos antigos padrões de class java.text.SimpleDateFormat fora de moda.

Observe como o segundo argumento para o método de parse é uma referência de método , syntax adicionada ao Java 8 e posterior.

 String input = "January 2, 2015"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MMMM d, yyyy" , Locale.US ); LocalDate localDate = LocalDate.parse ( input , formatter ); 

Despeje para consolar.

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

localDate: 2015-01-02

Localize automaticamente

Ou, em vez de especificar um padrão de formatação, deixe java.time localizar para você. Chame DateTimeFormatter.ofLocalizedDate e certifique-se de especificar o Locale desejado / esperado, em vez de confiar no padrão atual da JVM, que pode mudar a qualquer momento durante o tempo de execução (!).

 String input = "January 2, 2015"; DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ); formatter = formatter.withLocale ( Locale.US ); LocalDate localDate = LocalDate.parse ( input , formatter ); 

Despeje para consolar.

 System.out.println ( "input: " + input + " | localDate: " + localDate ); 

input: 2 de janeiro de 2015 | localDate: 2015-01-02

A conceituada biblioteca Joda Time também vale a pena dar uma olhada. Essa é a base para a nova API de data e hora que é desenhada para o Java 7. O design é limpo, intuitivo, bem documentado e evita muito da falta de jeito das classs java.util.Calendar / java.util.Date originais.

O DateFormatter do Joda pode analisar um String para um Joda DateTime .

Tente isto:

 DateFormat.parse(String) 

A class DateFormat tem um método de parse .

Consulte http://java.sun.com/j2se/1.4.2/docs/api/java/text/DateFormat.html para mais informações.