Analisar string para data com formato diferente em Java

Eu quero converter String para Date em diferentes formatos.

Por exemplo,

Estou recebendo do usuário,

 String fromDate = "19/05/2009"; // ie (dd/MM/yyyy) format 

Eu quero converter este fromDate como um object Date do formato "yyyy-MM-dd"

Como posso fazer isso?

Dê uma olhada no SimpleDateFormat . O código é algo assim:

 SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy"); SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); try { String reformattedStr = myFormat.format(fromUser.parse(inputString)); } catch (ParseException e) { e.printStackTrace(); } 

Use a class SimpleDateFormat :

 private Date parseDate(String date, String format) throws ParseException { SimpleDateFormat formatter = new SimpleDateFormat(format); return formatter.parse(date); } 

Uso:

 Date date = parseDate("19/05/2009", "dd/MM/yyyy"); 

Para eficiência, você desejaria armazenar seus formatadores em um hashmap. O hashmap é um membro estático da sua class util.

 private static Map hashFormatters = new HashMap(); public static Date parseDate(String date, String format) throws ParseException { SimpleDateFormat formatter = hashFormatters.get(format); if (formatter == null) { formatter = new SimpleDateFormat(format); hashFormatters.put(format, formatter); } return formatter.parse(date); } 

Verifique os javadocs para java.text.SimpleDateFormat Descreve tudo o que você precisa.

Converta uma data de cadeia em java.sql.Date

 String fromDate = "19/05/2009"; DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); java.util.Date dtt = df.parse(fromDate); java.sql.Date ds = new java.sql.Date(dtt.getTime()); System.out.println(ds);//Mon Jul 05 00:00:00 IST 2010 

tl; dr

 LocalDate.parse( "19/05/2009" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ) 

Detalhes

As outras respostas com java.util.Date , java.sql.Date e SimpleDateFormat agora estão desatualizadas.

LocalDate

A maneira moderna de fazer data-time é trabalhar com as classs java.time, especificamente LocalDate . A class LocalDate representa um valor somente de datas sem hora do dia e sem fuso horário.

DateTimeFormatter

Para analisar ou gerar uma String representando um valor de data e hora, use a class DateTimeFormatter .

 DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ); LocalDate ld = LocalDate.parse( "19/05/2009" , f ); 

Não combine um object de data e hora com uma String representando seu valor. Um object de data e hora não tem formato , enquanto uma String faz. Um object de data e hora, como LocalDate , pode gerar uma String para representar seu valor interno, mas o object de data e hora e a String são objects distintos separados.

Você pode especificar qualquer formato personalizado para gerar uma String. Ou deixe o java.time fazer o trabalho de localizar automaticamente.

 DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ) .withLocale( Locale.CANADA_FRENCH ) ; String output = ld.format( f ); 

Despeje para consolar.

 System.out.println( "ld: " + ld + " | output: " + output ); 

ld: 2009-05-19 | produção: mardi 19 mai 2009

Veja em ação no IdeOne.com .


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 .

Você pode trocar objects java.time diretamente com seu database. Use um driver JDBC compatível com o JDBC 4.2 ou posterior. Não há necessidade de strings, não há necessidade de classs java.sql.* .

Onde obter as classs java.time?

  • Java SE 8 , Java 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 Java SE 7
    • Grande parte da funcionalidade java.time é transferida para o Java 6 e 7 no ThreeTen-Backport .
  • Android
    • Versões posteriores das implementações do pacote Android das classs java.time.
    • Para Android anterior (<26), o projeto ThreeTenABP adapta o ThreeTen-Backport (mencionado acima). 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 .

Embora o SimpleDateFormat funcione de acordo com as suas necessidades, você também pode querer verificar o Joda Time , que aparentemente é a base da biblioteca Date do Java 7. Embora eu não tenha usado muito, não ouvi nada além de bom coisas sobre isso e se a sua manipulação data extensivamente em seus projetos, provavelmente valeria a pena investigar.

Maneira simples de formatar uma data e converter em string

  Date date= new Date(); String dateStr=String.format("%td/%tm/%tY", date,date,date); System.out.println("Date with format of dd/mm/dd: "+dateStr); 

saída: Data com formato dd / mm / dd: 21/10/2015

Um object Date não tem formato , é uma representação. A data pode ser apresentada por um String com o formato que você gosta .

Por exemplo, ” yyyy-MM-dd “, ” yy-MMM-dd “, ” dd-MMM-yy ” e etc.

Para conseguir isso, você pode obter o uso do SimpleDateFormat

Tente isso

  String inputString = "19/05/2009"; // ie (dd/MM/yyyy) format SimpleDateFormat fromUser = new SimpleDateFormat("dd/MM/yyyy"); SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd"); try { Date dateFromUser = fromUser.parse(inputString); // Parse it to the exisitng date pattern and return Date type String dateMyFormat = myFormat.format(dateFromUser); // format it to the date pattern you prefer System.out.println(dateMyFormat); // outputs : 2009-05-19 } catch (ParseException e) { e.printStackTrace(); } 

Isso resulta: 2009-05-19