terça-feira, 15 de setembro de 2015

Java 8 DateTime API - LocalDate e Period

Olá Pessoal, hoje iremos retomar o nosso estudo sobre a nova API de Data do Java 8. Esse artigo é o segundo da série sobre o assunto, você pode ler a primeira parte clicanco aqui. No post anterior vimos as classes Instant e Duration, que são conhecidas por Computer Dates, e são usadas, por exemplo, para medir o tempo de duração de um algoritmo.

Nós humanos geralmente precisamos representar datas mais complexas, com dias, meses, anos, fusos horários. Isso não possível através de Instant. Para tal, precisamos utilizar a classe java.time.LocalDate, ideal para representar datas do tipo Human Dates

LocalDates

Existem basicamente dois tipos de classes para representar datas na nova API, as Local Date/Time (LocalDate e LocalDateTime) e a ZonedDateTime. As datas locais possuem uma data ou hora de um dia, mas sem associação fusos horários, por exemplo, 11/05/1984, que é o em que eu nasci. Porém essa data não representa um instante de tempo preciso. Precisamos usar então a classe ZonedDateTime, com ela podemos criar uma data do tipo: 11/05/1984 11:30 [America/Cayenne], que representaria o exato momento do meu nascimento. Vejamos então um primeiro exemplo do uso de LocalDate.


Como você deve ter notado, diferentemente do que ocorria em java.util.Date, não é possível instanciar uma classe LocalDate diretamente, ela também não pode ser estendida, pois é uma classe final. Além disso, a classe LocalDate é imutável, ou seja, nenhuma operação nela irá modificar os valores instanciados, seus métodos sempre retornarão uma nova instância com as modificações desejadas.

No exemplo acima foi utilizado o método now, que retorna a data corrente do sistema. Em seguida fizemos uso do método of(int ano, Month mes, int dia) que possui uma versão sobrecarregada of(int ano, int mes, int dia). Vale destacar que foi corrigida uma bizarrice que havia na versão antiga da API que usava 0 para Janeiro, e isso causava muita confusão, agora você pode usar Month.MAY ou 5 para criar uma data com mês de Maio.

Manipulando Datas

Vejamos algumas operações importantes que existem na classe LocalDate. Vamos ao código e em seguida comentaremos o que ele faz.

Neste exemplo vemos como é fácil, através dos métodos plusXXX e minusXXX, adicionar ou remover uma medida de tempo de uma data de forma fácil e segura, mesmo que a data precise passar de um mês para o outro ou mesmo de um ano comum para um ano bissexto.

Ajustadores de Tempo

Um outro conceito bacana que foi introduzido na nova API de Datas é o de Temporal Adjuster. Imagine que você deseja implementar uma agendador para algum evento que vai se repetir, por exemplo, toda primeira segunda-feira de cada mês. Você já deve imaginar o trabalhão que dava para fazer isso com a API antiga. Pois bem, agora temos a classe TemporalAdjusters, que possui vários métodos estáticos para operações como essas. Vejamos algumas possibilidades.

Diferença entre Datas

Quando trabalhamos com a classe Instant vimos que para calcular a diferença entre dois Instants usamos a classe Duration. O mesmo resultado pode ser obtido com a classe Period, que armazena a diferença entre duas instâncias de LocalDate. Podemos obter informações como número de dias, meses ou anos passados entre duas datas. Vejamos um exemplo demonstrando o uso de Period.

O método until retorna uma instância de Period, que armazena o tempo passado entre duas datas em anos, meses e dias, isso nos poupa algum trabalho de conversão, mas pode ser que queiramos saber quantos dias absolutos existem entre duas datas, para isso, usamos o  método until sobrecarregado que recebe dois parâmetros, o primeiro é a data que estamos comparando e o segundo é a unidade de tempo que desejamos calcular (os valores permitidos são: DAYS, WEEKS, MONTHS, YEARS, DECADES, CENTURIES, MILLENNIA, ERAS).

Conclusão

A nova API de Datas ficou bastante rica se comparada com a anterior. Apesar do maior número de classes, elas ficaram mais coesas e com responsabilidades bem definidas. Até aqui vimos as datas para computadores, Instant e Duration, e as datas para humanos, LocalDate e Period. No próximo post veremos como utilizar datas com horas e fusos horários. Até o próximo post!

Nenhum comentário:

Postar um comentário