Durante a apresentação destas classes serão utilizados exemplos práticos com o intuito de facilitar o entendimento e a comparação com a API existente nas versões anteriores.
Até então, trabalhar com data e hora no Java sempre foi algo custoso, devido às limitações da API. Com base nisso, a nova API busca simplificar a manipulação e a representação destas informações, permitindo assim uma maior produtividade e clareza no desenvolvimento de software.
A manipulação de datas e horas está presente na maioria dos softwares, independente do porte ou do negócio por trás do sistema. Infelizmente, devido às limitações dos recursos disponíveis nas versões que antecederam a versão 8, desenvolver um software que possui uma quantidade razoável de manipulação de datas e horas sempre foi algo muito custoso.
Na primeira versão do Java, as datas e horas eram representadas através da classe java.util.Date, que basicamente é uma tradução da biblioteca de datas e horas da linguagem C. Em virtude disso, a primeira classe para manipular datas e horas no Java não tinha suporte a internacionalização.
A partir do Java 1.1, com a chegada da classe java.util.Calendar, esse problema foi resolvido. Porém, os recursos para manipular datas e horas disponíveis desde a versão 1.1 possuem várias limitações como, por exemplo, a ausência de:
· type-safe: como a maioria dos métodos utilizam um inteiro (int) como parâmetro, não existem garantias que um determinado valor será válido para o método invocado. Por exemplo, em um método que possui um parâmetro do tipo int para representar um mês, é difícil saber qual o valor correto para representar o mês de Janeiro, se 0 ou 1.
· thread-safe: por não ser thread-safe, a classe java.util.Calendar permite que uma thread interfira e altere informações de uma data e/ou hora de outra thread (interferência esta que não foi prevista durante o desenvolvimento), o que pode gerar um grande efeito colateral no sistema;
· flexibilidade: as classes existentes desde a concepção do Java não possuem flexibilidade para criar novos sistemas de calendários, obrigando os desenvolvedores a utilizar um sistema de calendário pré-estabelecido, como o GregorianCalendar.
Com o intuito de contornar os problemas mencionados e proporcionar aos desenvolvedores maior facilidade e produtividade na manipulação de datas e horas, foram projetadas e construídas muitas bibliotecas, sendo a mais popular a Joda-Time.
Com o passar do tempo, a Joda-Time se tornou a API de data e hora padrão (apesar de não oficial) de grande parte dos sistemas desenvolvidos com versões anteriores ao Java 8.
Esta é uma API fácil de utilizar, com suporte a diversos sistemas de calendários e com classes específicas para representar datas, horas, instantes, duração, períodos, entre outros.
Visando resolver grande parte dos problemas mencionados, em 2007 foi aprovada pelo JCP (Java Community Process) a proposta de uma nova API oficial de data e hora do Java, a JSR-310: Date and Time API.
Visão geral da API
A nova API de data e hora foi construída do zero, buscando corrigir todos os problemas existentes nas versões anteriores, utilizando, para isso, o Joda-Time como fonte de inspiração. Vale ressaltar que o líder da JSR-310 foi o mesmo que projetou a Joda-Time, Stephen Colebourne.
A implementação da JSR-310 foi planejada para ser lançada junto com a versão 8 do Java e possui as seguintes características:
· Imutabilidade: todas as classes são imutáveis, garantindo uma fácil utilização em ambientes multi-thread;
· Separação de conceitos: foram criadas duas categorias de tempo, uma para humanos (human time) e outra para máquinas (continuous time);
· Clareza: os métodos disponíveis nas novas classes possuem nomes condizentes com sua funcionalidade, além de uma documentação simples;
· Extensível: a nova API utiliza como padrão o sistema de calendário ISO-8601, porém permite a criação de outros sistemas de calendário de forma simples.
Com o intuito de manter as características citadas, novas classes foram criadas e são responsáveis por manipular datas, horas, fusos horários, instantes e duração. Estas novas classes estão divididas em cinco pacotes, que são apresentados na Tabela 1.
Pacote |
Descrição |
java.time |
O principal pacote da API, contém classes para manipulação de datas, horas, instantes e durações. |
java.time.chrono |
Pacote para definição e manipulação de sistemas de calendários não compatíveis com a norma ISO-8601. |
java.time.format |
Este pacote contém as classes usadas para formatar ou analisar (parse) uma data e/ou hora. |
java.time.temporal |
É uma extensão do pacote principal, adicionando funcionalidades relacionadas a unidades (ano, mês, dia, hora), campos (mês do ano, dia da semana, hora do dia, minuto do dia, segundo do dia), ajustadores temporais personalizados, etc. |
java.time.zone |
Pacote com classes para suporte a “time zone” e suas respectivas regras. |
Tabela 1. Pacotes da nova API de data e hora.
Esta norma é baseada no Calendário Gregoriano Proléptico, que o torna compatível com o Sistema de Calendário usado na maioria dos países.
Datas e horas para computadores
A data para computadores é representada por um simples número, incrementado a cada instante, baseado no Unix Time, que é um sistema para descrever um determinado instante em uma linha do tempo.
Esse instante é definido como um número que armazena a quantidade de segundos desde a meia-noite do dia 01 de janeiro de 1970 até a data e hora desejadas.
A java.time.Instant é a classe da nova API utilizada para representar um instante, que pode ser, por exemplo, o instante que um determinado processamento foi iniciado ou quando o mesmo terminou. ...