Obter data sem hora em Java
1. Introdução
Neste breve tutorial, mostraremos como obter umDate sem tempo em Java.
Mostraremos como fazer isso antes e depois do Java 8, uma vez que as coisas ficaram um pouco diferentes após o lançamento da nova API de tempo no Java 8.
2. Antes do Java 8
Antes do Java 8, não havia uma maneira direta de obter umDate sem tempo, a menos que estivéssemos usando bibliotecas de terceiros como o Joda-time.
Isso ocorre porquethe Date class in Java is a representation of a specific instant in time, expressed in milliseconds. Portanto, isso torna impossível ignorar o tempo em aDate.
Nas próximas seções, mostraremos algumas soluções alternativas comuns para resolver esse problema.
2.1. UsandoCalendar
Uma das maneiras mais comuns de obterDate sem tempo éuse the Calendar class to set the time to zero. Ao fazer isso, obtemos uma data limpa, com a hora definida no início do dia.
Vamos ver no código:
public static Date getDateWithoutTimeUsingCalendar() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
Se chamarmos esse método, teremos uma data como esta:
Sat Jun 23 00:00:00 CEST 2018
Como podemos ver, ele retorna uma data completa com o tempo definido como zero, maswe can’t ignore the time.
Além disso, para ter certeza de que não há tempo definido noDate retornado, podemos criar o seguinte teste:
@Test
public void whenGettingDateWithoutTimeUsingCalendar_thenReturnDateWithoutTime() {
Date dateWithoutTime = DateWithoutTime.getDateWithoutTimeUsingCalendar();
Calendar calendar = Calendar.getInstance();
calendar.setTime(dateWithoutTime);
int day = calendar.get(Calendar.DAY_OF_MONTH);
calendar.setTimeInMillis(dateWithoutTime.getTime() + MILLISECONDS_PER_DAY - 1);
assertEquals(day, calendar.get(Calendar.DAY_OF_MONTH));
calendar.setTimeInMillis(dateWithoutTime.getTime() + MILLISECONDS_PER_DAY);
assertNotEquals(day, calendar.get(Calendar.DAY_OF_MONTH));
}
Como podemos ver, quando adicionamos à data os milissegundos de um dia menos um, ainda temos o mesmo dia, mas quando adicionamos um dia inteiro, obtemos o dia seguinte.
2.2. Usando um formatador
Outra maneira de fazer isso é porformatting a Date into a String without the time and then convert that String back to a Date. Como oString foi formatado sem o tempo, oDate convertido terá o tempo definido como zero.
Vamos implementá-lo para ver como funciona:
public static Date getDateWithoutTimeUsingFormat()
throws ParseException {
SimpleDateFormat formatter = new SimpleDateFormat(
"dd/MM/yyyy");
return formatter.parse(formatter.format(new Date()));
}
Esta implementação retorna o mesmo que o método mostrado na seção anterior:
Sat Jun 23 00:00:00 CEST 2018
Novamente, podemos usar um teste como fizemos antes para garantir que não haja tempo noDate retornado.
3. Usando Java 8
Com o lançamento da nova API de horário no Java 8, há uma maneira mais fácil de obter uma data sem o horário. Um dos novos recursos que essa nova API trouxe é que existem várias classes para trabalhar com datas com ou sem tempo, ou mesmo para trabalhar apenas com tempo.
Para o propósito deste artigo, vamos nos concentrar na classeLocalDate, que representa exatamente o que precisamos, uma data sem a hora.
Vamos ver com este exemplo:
public static LocalDate getLocalDate() {
return LocalDate.now();
}
Este método retorna um objetoLocalDate com esta representação de data:
2018-06-23
Como podemos ver, ele retorna apenas uma data,the time is completely ignored.
Mais uma vez, vamos testar como antes para ter certeza de que esse método funciona conforme o esperado:
@Test
public void whenGettingLocalDate_thenReturnDateWithoutTime() {
LocalDate localDate = DateWithoutTime.getLocalDate();
long millisLocalDate = localDate
.atStartOfDay()
.toInstant(OffsetDateTime
.now()
.getOffset())
.toEpochMilli();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(
millisLocalDate + MILLISECONDS_PER_DAY - 1);
assertEquals(
localDate.getDayOfMonth(),
calendar.get(Calendar.DAY_OF_MONTH));
calendar.setTimeInMillis(millisLocalDate + MILLISECONDS_PER_DAY);
assertNotEquals(
localDate.getDayOfMonth(),
calendar.get(Calendar.DAY_OF_MONTH));
}
4. Conclusão
Neste artigo, mostramos como obter umDate sem tempo em Java. Primeiro mostramos como fazer isso antes do Java 8 e também usando o Java 8.
Como pudemos ver nos exemplos implementados no artigo, usandoJava 8 should be always the preferred option, pois tem uma representação específica para trabalhar com datas sem hora.
Como sempre, o código-fonte completo dos exemplos está disponívelover on GitHub.