Conversão de formato de data Java – recebendo o mês errado

Eu tenho um problema em converter a data em java, não sei onde estou indo errado …

String dateStr = "2011-12-15"; String fromFormat = "yyyy-mm-dd"; String toFormat = "dd MMMM yyyy"; try { DateFormat fromFormatter = new SimpleDateFormat(fromFormat); Date date = (Date) fromFormatter.parse(dateStr); DateFormat toformatter = new SimpleDateFormat(toFormat); String result = toformatter.format(date); } catch (ParseException e) { e.printStackTrace(); } 

A data de input é 2011-12-15 e estou esperando o resultado como “15 de dezembro de 2011”, mas entendi como “15 de janeiro de 2011”

Onde eu estou errando?

Seu fromFormat usa os minutos em que deve usar meses.

 String fromFormat = "yyyy-MM-dd"; 

Eu acho que o fromFormat deve ser “aaaa-MM-dd”.

Aqui está o formato:

  • m == minuto em hora
  • M == Mês no Ano

Mais: http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

Do formato deve ser:

 String fromFormat = "yyyy-MM-dd" 

Olhe para o javadoc de SimpleDateFormat e veja o que o m representa. Não meses como você pensa, mas minutos.

  String fromFormat = "yyyy-MM-dd"; 

m em SimpleDateFormat significa minutos, enquanto M significa mês. Assim, seu primeiro formato deve ser yyyy-MM-dd .

tl; dr

 LocalDate.parse( "2011-12-15" ) // Date-only, without time-of-day, without time zone. .format( // Generate `String` representing value of this `LocalDate`. DateTimeFormatter.ofLocalizedDate( FormatStyle.LONG ) // How long or abbreviated? .withLocale( // Locale used in localizing the string being generated. new Locale( "en" , "IN" ) // English language, India cultural norms. ) // Returns a `DateTimeFormatter` object. ) // Returns a `String` object. 

15 de dezembro de 2011

java.time

Embora a resposta aceita esteja correta ( MM maiúsculas por mês), agora há uma abordagem melhor. As antigas classs problemáticas de data e hora agora são herdadas, suplantadas pelas classs java.time.

Sua string de input está no formato padrão ISO 8601 . Portanto, não é necessário especificar um padrão de formatação para análise.

 LocalDate ld = LocalDate.parse( "2011-12-15" ); // Parses standard ISO 8601 format by default. Locale l = new Locale( "en" , "IN" ) ; // English in India. DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.LONG ) .withLocale( l ); String output = ld.format( f ); 

Despeje para consolar.

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

ld.toString (): 2011-12-15

output: 15 de dezembro de 2011

Veja o código ao vivo em 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 , Java SE 10 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 .

Bem, isso pode não ser o seu caso, mas pode ajudar alguém. No meu caso, após a conversão, dia do mês e mês set 1. Então, seja qual for a data, após a conversão eu recebo 1 jan que está errado. Depois de lutar eu achei que em formato de data eu usei YYYY vez de yyyy . Quando eu mudei todas as tampas Y para y ele funciona bem.