Utilizando LocalDate, LocalDateTime e LocalTime na Prática

Tudo bem pessoal, hoje iremos avaliar e analisar operações de manipulação de Datas envolvendo a JavaTime API introduzida no Java 8.

Exemplos da java.time API


Já se passaram alguns anos desde o lançamento do Java 8 e mesmo após este período, há empresas que desconhecem o poder da java.time API, esta foi uma nova API de datas introduzida no Java 8 visando resolver problemas que tínhamos com as velhas classes Date e Calendar.

Vamos mostrar vários exemplos práticos do uso da API:

Criação de objetos

No exemplo abaixo, estamos criando os objetos para manipulação de datas, perceba que temos 3 tipos, sendo LocalDate para manipular datas, LocalDateTime para manipular data/hora e LocalTime para horas:

LocalDate localDate      = LocalDate.now();
LocalDateTime localDateTime = LocalDateTime.now();
LocalTime localTime      = LocalTime.now();

Utilizando formatação

Aqui realizamos a operação de formatação, perceba que não foi necessário utilizar a classe SimpleDateFormat, que usaríamos em conjunto com Date ou Calendar, aqui utilizamos a DateTimeFormatter passando o formato desejado:

String strLocalDate2   = LocalDateTime.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
String strLocalDateTime2 = LocalDateTime.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"));
String strLocalTime2   = LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"));

Adicionando dias, meses e horas

Um recurso muito interessante são os métodos de adicionar períodos, quem já trabalhou com Calendar sabe como essa tarefa era complexa, onde era necessário manipular métodos void e passar constantes para determinar  qual parte gostaríamos de alterar, aqui basta chamar o método plus desejado de forma fluente, veja o exemplo:

LocalDate localDate3         = LocalDate.now().plusDays(1).plusMonths(1);
LocalDateTime localDateTime3 = LocalDateTime.now().plusDays(1).plusMonths(1).plusHours(2);

Subtraindo dias, meses e horas

Da mesma forma que acontece a adição de valores,  podemos também subtrair dados de diferentes parte do período:

LocalDate localDate4       = LocalDate.now().minusDays(1).plusMonths(1);
LocalDateTime localDateTime4 = LocalDateTime.now().minusDays(1).minusMonths(1).minusHours(2);
LocalTime localTime4       = LocalTime.now().minusHours(1);

Criando objetos específicos

Um recurso interessante é quando criamos uma data com valores específicos, onde cada tipo possui métodos fábricas para construção dos objetos:

LocalDate localDate5       = LocalDate.of(2018, 07, 22);
LocalDateTime localDateTime5 = LocalDateTime.of(2018, 07, 22, 10, 15, 30);
LocalTime localTime5       = LocalTime.of(10, 35, 12);

Realizando parse de String em Datas

Uma das situações mais comuns é a operação de parse, que consiste em pegar uma data como String e transformar para a classe de Período correspondente:

LocalDate localDate6       = LocalDate.parse("2018-07-22", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
LocalDateTime localDateTime6 = LocalDateTime.parse("2018-07-22 10:35:10", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
LocalTime localTime6       = LocalTime.parse("11:40:02", DateTimeFormatter.ofPattern("HH:mm:ss"));

Recuperando partes especificas de um objeto

Outro recurso interessante e muito utilizando é quando temos que recuperar uma parte especifica do objeto, podendo ser ano, mês, dia, hora, minuto, segundo:

int year    = LocalDate.now().getYear();
Month month = LocalDateTime.now().getMonth();
int hour    = LocalTime.now().getHour();

Comparando com os métodos isAfter, isBefore e isEqual

Com frequência temos que comparar objetos Data, analisando se um período é maior, menor ou igual ao outro, para isto temos métodos utilitários que facilitam esse tipo de ação, veja abaixo:

LocalDate localDate8 = LocalDate.now();
LocalDate localDate9 = LocalDate.now().minusDays(1);
  
boolean isAfter  = localDate8.isAfter(localDate9);   //true
boolean isBefore = localDate8.isBefore(localDate9); //false
boolean isEqual  = localDate8.isEqual(localDate9); //false

Capturando Diferenças entre LocalDate com classe Period

É comum precisar saber a diferença entre dois objetos Data, aqui temos a classe Period que possui vários métodos utilitários para esta finalidade, esta classe representa o tempo em anos, meses e dias, vamos testar o método between que recupera a diferença entre dois objetos LocalDate, veja abaixo:

LocalDate localDate10 = LocalDate.now();
LocalDate localDate11 = LocalDate.now().plusDays(2);
  
Period period1 = Period.between(localDate10, localDate11); 

Capturando Diferenças com a Enum ChronoUnit

A Enum ChronoUnit é utilizada para manipular Tempos, com ela podemos manipular tempos de  diferentes formas, podemos utiliza-la em conjunto com LocalDate, LocalDateTime e LocalTime, segue o exemplo:


LocalDateTime localDateTime12 = LocalDateTime.now();
LocalDateTime localDateTime13 = LocalDateTime.now().plusDays(2);
  
long periodAsMinutes = ChronoUnit.MINUTES.between(localDateTime12, localDateTime13);
long periodAsHours  = ChronoUnit.HOURS.between(localDateTime12, localDateTime13);
long periodAsDays = ChronoUnit.DAYS.between(localDateTime12, localDateTime13);

A API java.time possui uma porção de outros métodos e classes que podemos utilizar no decorrer dos projetos, trabalhar com datas, períodos, tempos, é praticamente obrigatórios em 90% dos sistemas.

A maioria dos frameworks do Mundo Java como Spring, Hibernate, JSF, já fornecem suporte full para o uso da API.

Até mais.

Código fonte

Referências

Comentários

Popular Posts

Criando arquivos de log com Log4J

Monitorando o Tomcat com Java VisualVM

AngularJS - Formatando Datas com o Filter Date

Injeção de dependências em Java EE usando @Inject, @EJB e @Resource ?

Gerenciamento de Transações com EJB - Parte 2

Configurando o arquivo application.properties do SpringBoot

JBoss AS 7 - Instalação e Configuração

Lendo e Manipulando arquivos CSV com Java

Métodos Utilitários da Classe String

Criando uma Aplicação com Spring Boot e MongoDB