Sendo assim, esse tema é útil para todos os desenvolvedores que ainda não tiveram a chance de conhecer essa nova API e têm interesse em atualizar seus conhecimentos, viabilizando com isso a adoção das facilidades oferecidas por mais uma inovação do Java.
Por muitos anos, na linguagem Java tivemos dificuldades com a manipulação de datas e horas. Como primeiro recurso disponível, tivemos a classe java.util.Date, mas que rapidamente passou a ser considerada complexa e bastante limitada.
Em 1998, a IBM desenvolveu e disponibilizou a classe java.util.Calendar, com recursos como internacionalização, métodos para alterar individualmente o dia, o mês ou o ano de uma data, variáveis estáticas pré-definidas com a descrição dos dias da semana e dos meses do ano, entre outros que eram inexistentes na classe Date.
A classe Calendar, embora tenha trazido maior flexibilidade à manipulação de datas, ainda era considerada complexa por grande parte dos programadores.
Como solução para Date e Calendar, em 2005 o projeto Joda Time foi lançado. Ele consiste de uma biblioteca externa ao JDK/JRE, criada por Stephen Colebourne, que rapidamente foi adotada por muitos desenvolvedores como a principal API para datas no Java.
Durante a idealização do Java 8, avaliou-se como necessário definir uma API nativa que correspondesse às necessidades dos desenvolvedores em relação à manipulação de datas. Como o projeto Joda Time foi bem aceito pela comunidade, optou-se por toma-lo como uma das principais referências.
Stephen Colebourne veio então a ser um dos líderes deste novo projeto, que foi lançado no Java 8 como a especificação JSR-310, Date and Time API (apelidada de Java Time).
Segundo Colebourne, o grande problema encontrado nas classes Date e Calendar é que elas são mutáveis, ou seja, é possível alterar externamente o valor de um atributo desse tipo. Outro problema citado por Colebourne é que os anos iniciam a partir de 1900 e os meses a partir de zero.
Por exemplo, o mês de Janeiro tem valor correspondente àzero (0), o mês de Fevereiro a um (1) e assim sucessivamente até dezembro, que tem o valor 11. Além disso, há uma complexidade na manipulação de datas criadas a partir das classes Date e Calendar que não poderia ser corrigida sem descaracterizar completamente estas classes.
Por exemplo, os métodos da classe Calendar não são considerados intuitivos, já que os nomes dados a eles muitas vezes não deixa clara as suas funções. Por sua vez, a classe Date já possui grande parte de seus métodos marcados como deprecated (descontinuado) e a inserção de novos métodos poderia deixar a classe mais confusa.
Assim sendo, foi necessário pensar em uma nova API, a qual deu origem ao pacote java.time e a classes como LocalDate, LocalTime, Period, Instant, ZoneDateTime, entre outras.
Como característica principal, todas as classes da API Java Time são imutáveis, corrigindo um problema que, conforme Colebourne, era grave nas classes Date e Calendar.
Outro ponto positivo é que esta API fornece uma manipulação muito mais simples para trabalhar com objetos que armazenam apenas datas, apenas horas ou ambas simultaneamente.
Por exemplo, você poderia armazenar o aniversário de alguém a partir da classe MonthDay. Um objeto desse tipo vai armazenar apenas os valores correspondentes ao mês e ao dia. E ainda temos as classes Year e YearMonth, para armazenar apenas o ano ou o ano e o mês em um mesmo objeto.
Dito isso, reforça-se que no decorrer deste artigo o leitor vai ter a chance de conhecer os recursos da API Java Time. Como esta API é nativa do Java 8, é preciso que o JDK e o JRE estejam ambos atualizados para a versão 8 do Java.
Usando as classes LocalDate, LocalTime e LocalDateTime
É provável que as classes LocalDate, LocalTime e LocalDateTime se tornem as mais utilizadas por você ao lidar com essa API. Com elas podemos capturar a data e a hora atual do sistema, inserir e redefinir uma data ou horário por meio de métodos específicos, entre outras possibilidades. Os parâmetros destes métodos podem representar um dia, um mês, horas, minutos, segundos ou nanosegundos.
Na Listagem 1 é apresentado como capturar a data atual, a hora e a data, e apenas a hora, com o método now().
Listagem 1. Capturando apenas a data, apenas a hora, e a data e a hora.
LocalDate dataAtual = LocalDate.now();
System.out.println("Data: " + dataAtual);
LocalTime horaAtual = LocalTime.now();
System.out.println("Hora: " + horaAtual);
LocalDateTime dataHoraAtual = LocalDateTime.now();
System.out.println("Data e Hora: " + dataHoraAtual);
A saída no console após a execução desse código é:
Data: 2014-08-21
...