Antes de tudo, você precisa entender uma coisa:
Datas não têm formato
Uma data é apenas um conceito, uma ideia: ela representa um ponto específico no calendário.
Por exemplo, a data de “15 de janeiro de 2020”, por exemplo, representa isso: o ponto específico do calendário que corresponde ao dia 15 do mês de janeiro do ano de 2020. Para expressar essa ideia em forma de texto, eu posso escrevê-la de diferentes formas:
- 15/01/2020 (um formato bem comum em muitos países, incluindo o Brasil)
- 1/15/2020 (formato americano, invertendo o dia e mês)
- 2020-01-15 (o formato [ISO 8601][3])
- Quinze de Janeiro de 2020 (em bom português)
- January 15th, 2020 (em inglês)
- 2020年1月15日 (em japonês)
- e muitos outros…
Repare que cada um dos formatos acima é diferente, mas todos representam a mesma data (os mesmos valores numéricos do dia, mês e ano).
Em Java, uma data é representada por java.util.Date
(e a partir do Java 8, por java.time.LocalDate
), e os formatos (os textos que representam a data) são String
's.
Se a data está em um formato e você quer transformar em outro, então na verdade você tem uma String
que representa a data em um formato. Por isso, primeiro você tem que transformar esta string em data, e depois converter esta data para outra String
, no outro formato.
Para transformar uma String
em data, você faz um parsing, e para transformar esta data em outra String
, você faz uma formatação. E como os formatos são diferentes, você precisa de 2 SimpleDateFormat
:
SimpleDateFormat formatoBr = new SimpleDateFormat("dd-MM-yyyy");
SimpleDateFormat formatoEua = new SimpleDateFormat("MM-dd-yyyy");
String strFormatoBr = "20-10-2020";
// faz o parsing da string em formato brasileiro, obtendo a data
Date data = formatoBr.parse(strFormatoBr);
// converte a data para String em formato americano
String strFormatoEua = formatoEua.format(data);
System.out.println(strFormatoEua); // 10-20-02020
Se estiver usando Java >= 8, outra opção é usar a API java.time
:
DateTimeFormatter formatoBr = DateTimeFormatter.ofPattern("dd-MM-uuuu");
DateTimeFormatter formatoEua = DateTimeFormatter.ofPattern("MM-dd-uuuu");
String strFormatoBr = "20-10-2020";
// faz o parsing da string em formato brasileiro, obtendo a data
LocalDate data = LocalDate.parse(strFormatoBr, formatoBr);
// converte a data para String em formato americano
String strFormatoEua = formatoEua.format(data);
System.out.println(strFormatoEua); // 10-20-2020