Por que eu devo ler este artigo:Este artigo é útil por apresentar a implementação da JSR-310, disponível no Java 8, que reformulou totalmente os recursos para manipulação de datas e horas. Esta reformulação está centralizada em um novo pacote e distribuída em uma série de classes que serão abordadas neste artigo.

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.

Nota: A ISO-8601 é uma norma internacional emitida pela Organização Internacional de Padronização (International Organization for Standards - ISO) com o objetivo de eliminar o risco de dupla interpretação quando datas e horas são utilizadas entre sistemas ou além das fronteiras nacionais.

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. ...

Quer ler esse conteúdo completo? Tenha acesso completo