Converter java.util.Date em String
1. Visão geral
Neste tutorial, mostraremos como podemosconvert Date objects to String objects in Java. Para fazer isso, trabalharemos com o tipojava.util.Date mais antigo, bem como com a nova APIDate/Time introduzida no Java 8.
Se você gostaria de aprender como fazer a conversão oposta, ou seja, dos tiposString paraDate, você pode verificarthis tutorial here.
Para obter mais detalhes sobre a nova APIDate/Time, consultethis related tutorial.
2. Convertendojava.util.Date emString
Embora não devamos usarjava.util.Date se estivermos trabalhando com Java 8, às vezes não temos escolha (por exemplo, estamos recebendo o objetoDate de uma biblioteca que não está em nosso controle) .
Nesses casos, temos várias maneiras de converterjava.util.Date emString à nossa disposição.
2.1. Preparando o objetoDate
Vamos primeiro declarar uma representaçãoString esperada de nossa data e definir um padrão de formato de data desejado:
private static final String EXPECTED_STRING_DATE = "Aug 1, 2018 12:00 PM";
private static final String DATE_FORMAT = "MMM d, yyyy HH:mm a";
Agora precisamos do objetoDate real que gostaríamos de converter. Usaremos uma instânciaCalendar para criá-lo:
TimeZone.setDefault(TimeZone.getTimeZone("CET"));
Calendar calendar = Calendar.getInstance();
calendar.set(2018, Calendar.AUGUST, 1, 12, 0);
Date date = calendar.getTime();
DefinimosTimeZone padrão paraCET para evitar problemas ao trabalhar com a nova API posteriormente. Devemos observar quethe Date itself doesn’t have any time zone, but its toString() uses the current default time zone.
Estaremos usando esta instânciaDate em todos os nossos exemplos abaixo.
2.2. Usando a classeSimpleDateFormat
Faremos uso do métodoformat() da classeSimpleDateFormat neste exemplo. Vamos criar uma instância dele usando nosso formato de data:
DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
Depois disso, podemos formatar nossa data e compará-la com a saída esperada:
String formattedDate = formatter.format(date);
assertEquals(EXPECTED_STRING_DATE, formattedDate);
2.3. Usando a classe AbstractDateFormat
Como poderíamos ter visto,SimpleDateFormat é uma subclasse da classe abstrataDateFormat. Esta classe fornece vários métodos para formatação de data e hora.
Vamos usá-lo para obter o mesmo resultado acima:
String formattedDate = DateFormat
.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT)
.format(date);
Com essa abordagem, estamos passando padrões de estilo -MEDIUM para a data eSHORT para a hora em nosso caso.
3. Usando a classeFormatter
Outra maneira simples de obter o mesmoString dos exemplos anteriores é usar a classeFormatter.
Embora esta possa não ser a solução mais legível,it is a thread-safe one-liner that could be useful, especially in a multi-threaded environment (devemos ter em mente queSimpleDateFormat não é thread-safe):
String formattedDate = String.format("%1$tb %1$te, %1$tY %1$tI:%1$tM %1$Tp", date);
Usamos1$ para indicar que passaremos apenas um argumento a ser usado com cada sinalizador. Uma explicação detalhada dos sinalizadores pode ser encontrada emDate/Time Conversions part da classeFormatter.
4. Convertendo usando Java 8Date/Time API
A APIDate/Time do Java 8 é muito mais poderosa do que as classesjava.util.Dateejava.util.Calendar e devemos usá-la sempre que possível. Vamos ver como podemos usá-lo para converter nosso objetoDate existente paraString.
Desta vez, usaremos a classeDateTimeFormatter e seu métodoformat(), bem como o mesmo padrão de data, declarado na Seção 2.1:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);
Para usar a nova API, precisamosconvert our Date object to an Instant object:
Instant instant = date.toInstant();
Como nossoString esperado tem partes de data e hora,we also need to convert the Instant object to LocalDateTime:
LocalDateTime ldt = instant
.atZone(ZoneId.of("CET"))
.toLocalDateTime();
E, finalmente, podemos obter facilmente nossoString formatado:
String formattedDate = ldt.format(formatter);
5. Conclusão
Neste artigo, ilustramosseveral ways of converting java.util.Date objects to String. Primeiro mostramos como fazer isso usando as classesjava.util.Dateejava.util.Calendar mais antigas e as classes de formatação de data correspondentes.
Em seguida, usamos a classeFormatter e, por fim, a API Java 8 Date / Time.
Como sempre, o código-fonte completo pode ser encontradoover on GitHub.