Como obter o início e o fim de um dia usando Java
1. Visão geral
Neste breve tutorial,we’ll learn how to get the start and the end of a day in Java, usando exemplos simples e diretos para diferentes cenários.
Estaremos usandoJava’s 8 Date/Time API para construir esses exemplos.
Caso queira ler um pouco mais sobre a biblioteca Java 8 Date and Time antes de continuar, você pode começarhere.
2. De um objetoLocalDate
Em primeiro lugar, vamos ver como podemos obter o início ou o final de um dia dado a nós como um objetoLocalDate, como:
LocalDate localDate = LocalDate.parse("2018-06-23");
2.1. atStartOfDay()
A maneira mais simples de obter umLocalDateTime representando o início de um determinado dia é usando o métodoatStartOfDay():
LocalDateTime startOfDay = localDate.atStartOfDay();
Este método está sobrecarregado, portanto, caso desejemos obterZonedDateTime dele, podemos fazer isso especificandoZoneId:
ZonedDateTime startOfDay = localDate.atStartOfDay(ZoneId.of("Europe/Paris"));
2.2. of()
Outra maneira de obter o mesmo resultado é usando o métodoof(), fornecendo umLocalDatee um dos campos estáticos deLocalTime:
LocalDateTime startOfDay = LocalDateTime.of(localDate, LocalTime.MIDNIGHT);
LocalTime oferece os seguintes campos estáticos:MIDNIGHT (00:00),MIN (00:00),NOON (12:00) eMAX (23: 59: 59.999999999).
Portanto, se quisermos chegar ao fim do dia, usaríamos o valorMAX.
Vamos experimentar, mas com um método diferente.
2.3. atTime()
Esse método está sobrecarregado, permitindo especificar o tempo desejado usando horas, minutos, segundos ou até nanossegundos.
Nesse caso, de qualquer forma, usaremos o campoLocalTime'sMAX como o argumento para obter o último momento de determinado dia:
LocalDateTime startOfDay = localDate.atTime(LocalTime.MAX);
2.4. atDate()
Este exemplo é bastante semelhante aos anteriores, mas desta vez, usaremos o métodoatDate() de um objetoLocalTime, passandoLocalDate como argumento:
LocalDateTime endOfDate = LocalTime.MAX.atDate(localDate);
3. De um objetoLocalDateTime
É quase desnecessário dizer que podemos obterLocalDate dele e, em seguida, usar qualquer um dos métodos da seção 2 para obter o fim ou o início do dia a partir dele:
LocalDateTime localDateTime = LocalDateTime
.parse("2018-06-23T05:55:55");
LocalDateTime endOfDate = localDateTime
.toLocalDate().atTime(LocalTime.MAX);
Mas nesta seção, vamos analisar um outro método para obter o objeto com sua seção de tempo definida para o início ou fim do dia, diretamente de outro objetoLocalDateTime fornecido.
3.1. with()
All classes implementing the Temporal interface can use this method.
Neste caso, usaremos a assinatura do método que leva umTemporalField (notavelmente, um dos valoresChronoField Enum) e um sargumentolong como o novo valor do campo:
LocalDateTime endOfDate = localDateTime.with(ChronoField.NANO_OF_DAY, LocalTime.MAX.toNanoOfDay());
4. De um objetoZonedDateTime
Se tivermos umZonedDateTime,, podemos usar o métodowith(), pois ele também implementaTemporal interface:
ZonedDateTime startofDay = zonedDateTime.with(ChronoField.HOUR_OF_DAY, 0);
5. Conclusão
Para resumir, analisamos muitas maneiras diferentes de obter o início e o fim de um dia em Java para muitos cenários de caso diferentes.
Por fim, aprendemos sobre os insights das 8 classes da biblioteca de data e hora do Java e nos familiarizamos com muitas de suas classes e interfaces.
Como sempre, todos os exemplos podem ser acessados emour GitHub repository.