Gabriel Machado
Gabriel Machado06/04/2021 21:53
Compartilhe

Trabalhando com Datas em Java

  • #Java

O java.util.Date

Antes de qualquer coisa, vamos definir aqui o ponto que estamos.

A implementação do java.util.Date está na JDK desde sua versão 1.0

Ou seja... É de se esperar que algumas coisas não se mostrem tão interessantes nos dias atuais, dado a sua idade.

Nesse primeiro momento, vamos ver como podemos trabalhar com a manipulação de datas a Classe java.util.Date do Java.

E o nosso primeiro passo é dar uma olhada na documentação oficial.

Vamos usar como referência o Java 8

E para começar a falar sobre o Java Date, vamos falar sobre seus construtores. São eles:

Date()

// Marcado como @Deprecated desde a versão 1.1 da JDK
Date(int year, int month, int date)

// Marcado como @Deprecated desde a versão 1.1 da JDK
Date(int year, int month, int date, int hrs, int min)

// Marcado como @Deprecated desde a versão 1.1 da JDK
Date(int year, int month, int date, int hrs, int min, int sec)

Date(long date)

// Marcado como @Deprecated desde a versão 1.1 da JDK
Date(String s)

Date()

Este construtor vai alocar um objeto da classe Date e o inicializará com o milissegundo mais próximo do período da sua execução.

import java.util.Date;

public class Exemplo001 {
      public static void main(Stirng[] args) {
              Date novaData = new Date();
      
              System.out.println(novaData); // Tue Apr 06 20:23:08 BRT 2021
      } 
}

Date(long date)

Diferente do construtor anterior, esse construtor espera que você passe os milissegundos com base padrão de tempo (epoch) que usa como referência 1 de janeiro de 1970 00:00:00.

Uma pequena pausa... O que é Epoch?

"O epoch timestamp é um padrão largamente aceito para representar uma data como um inteiro 32-bits a partir do início do Unix Epoch..."

Tradução feita por Marco Paulo Ollivier do Livro "Software Development: Na Open Source Approach" escrito por Allen Tucker, Ralph Morelli e Chamindra de Silva. Página 163. Editora CRC Press

Vamos testar com base no System.currentTimeMillis()

Esse método estático vai nos retornar o milissegundo mais próximo de sua execução com base no Sistema Operacional.

import java.util.Date;

public class Exemplo001 {
      public static void main(Stirng[] args) {
              Long currentTimeMillis = System.currentTimeMillis**();**
              
              System.out.println(currentTimeMillis);
              // 1617752114615

              Date novaData = new Date(currentTimeMillis);
      
              System.out.println(novaData); // Tue Apr 06 20:36:02 BRT 2021
      } 
}

Métodos úteis

Alguns métodos da classe Date são muito úteis e serão usados com frequência durante a manipulação de datas.

São eles...

image

O java.util.Calendar

Já na JDK 1.1 foi observada a necessidade de facilitar alguns recursos que a class Date oferecia.

Sendo assim, a classe Calendar foi criada.

Com isso uma série de métodos e construtores da classe Date foi depreciada. Por exemplo o construtor Date(int year, int month, int date).

Calendar é uma classe abstrata que provê métodos para converter data entre um instante específico.

O Calendar possui alguns campos específicos para manipulação com MONTH, YEAR, HOUR, etc.

Capturando o instante atual com o Calendar:

import java.util.Calendar;

public class Exemplo005 {
      public static void main(String[] args) {
              Calendar agora =  Calendar.getInstance();

              System.out.println(agora); // java.util.GregorianCalendar[time=1617753483688,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/Sao_Paulo",offset=-10800000,dstSavings=0,useDaylight=false,transitions=93,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=3,WEEK_OF_YEAR=15,WEEK_OF_MONTH=2,DAY_OF_MONTH=6,DAY_OF_YEAR=96,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=8,HOUR_OF_DAY=20,MINUTE=58,SECOND=3,MILLISECOND=688,ZONE_OFFSET=-10800000,DST_OFFSET=0]
      }
}

Manipulando datas:

import java.util.Calendar;

public class Exemplo006 {
      public static void main(String[] args) {
              Calendar agora =  Calendar.getInstance();

              System.out.println("A data corrente é: " + agora.getTime());
              
              agora.add(Calendar.DATE, -15);
              System.out.println("15 dias atrás: " + agora.getTime());
              
              agora.add(Calendar.MONTH, 4)
              System.out.println("4 meses depois: " + agora.getTime());
              
              agora.add(Calendar.YEAR, 2)
              System.out.println("2 anos depois: " + agora.getTime());
      }
}

Imprimindo datas e horas

Aqui vão algumas maneiras de se converter o resultado de um objeto Calendar

import java.util.Calendar;

public class Exemplo007 {
      public static void main(String[] args) {
              Calendar agora = Calendar.getInstance();
              
              System.out.printf("%tc\\n", agora);
              // Dom jul 14 20:58:11 BRT 2019

              System.out.printf("%tF\\n", agora);
              // 2019-07-14

              System.out.printf("%tD\\n", agora);
              // 07/14/19

              System.out.printf("%tr\\n", agora);
              // 09:58:11 PM

              System.out.printf("%tT\\n", agora);
              // 20:58:11
      }
}

O java.text.DateFormat

Nesse ponto em que estamos existem, basicamente, duas classes para formatação de datas. O DateFormat e o SimpleDateFormat.

Ambos oferecem maneiras de formatar e parsear a saída das datas.

import java.text.DateFormat;
import java.util.Date;

public class Exemplo008 {
  public static void main(String[] args) {
      Date agora = new Date();

      String dateToStr = DateFormat.getInstance().format(agora);

      System.out.println(dateToStr);
              // 06/04/2021 21:14
      
              dateToStr = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT).format(agora);

      System.out.println(dateToStr);
              // 6 de abril de 2021 21:13

              dateToStr = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(agora);

      System.out.println(dateToStr);
              // 6 de abril de 2021 21:16:45 BRT
  }
}

Já o SimpleDateFormat traz uma grande facilidade que é definir um padrão de formatação para a saída de data que você deseja.

import java.text.SimpleDateFormat;
import java.util.Date;

public class Exemplo009 {
  public static void main(String[] args) {
      Date agora = new Date();

      SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

      String dataFormatada = formatter.format(agora);

      System.out.println(dataFormatada);
              // 06/04/2021
  }
}

Datas no Java 8+

O Java 8 veio com uma série de novidades para facilitar o trabalho com Datas.

E a grande melhoria está no pacote java.time que foi herdado do projeto Joda Time.

Trabalhar com datas nunca foi tão fácil com esse novo pacote.

Nele destacam-se três classes:

  • LocalDate
  • LocalTime
  • LocalDateTime

Basicamente, o que tínhamos até então eram as classes que vimos até agora: Date e Calendar.

Com o uso constante, elas se mostraram confusas e trabalhosas, além de serem mutáveis.

LocalDate é uma classe imutável para representar uma data.

Seu formato padrão é yyyy-MM-dd

import java.time.LocalDate;

public class Exemplo010 {
  public static void main(String[] args) {
      LocalDate hoje = LocalDate.now();

      System.out.println(hoje);
      // 2021-04-06
  }
}
import java.time.LocalDate;

// Exemplo de como manipular LocalDate
public class Exemplo011 {
  public static void main(String[] args) {
      LocalDate hoje = LocalDate.now();

      LocalDate ontem = hoje.minusDays(1);

      System.out.println(hoje);
      // 2021-04-06

      System.out.println(ontem);
      // 2021-04-05
  }
}

LocalTime é uma classe imutável que representa um padrão de hora-minuto-segundo.

LocalTime pode ser representado até o nível de nanosegundos. Exemplo: 12:22:10.123212345

Sua utilização é similar ao LocalDate.

import java.time.LocalTime;

// Exemplo de como utilizar LocalTime
public class Exemplo012 {
  public static void main(String[] args) {
      LocalTime agora = LocalTime.now();

      System.out.println(agora);
      // 21:36:06.117315525
  }
}
import java.time.LocalTime;

// Exemplo de como manipular LocalTime
public class Exemplo013 {
  public static void main(String[] args) {
      LocalTime agora = LocalTime.now();

      System.out.println(agora);
      // 21:36:06.117315525

              LocalTime maisUmaHora = agora.plusHours(1);

              System.out.println(maisUmaHora);
              // 22:36:06.117315525
  }
}

LocalDateTime funciona como uma espécie de junção entre o LocalTime e o LocalDate.

Também é uma classe imutável e você consegue trabalhar com dia e hora de uma só vez.

Você pode manipular a data e hora com precisão de nanosegundos. Exemplo: 2nd October 2007 at 13:45:30.123456789

import java.time.LocalDateTime;

// Exemplo de como manipular LocalDateTime
public class Exemplo014 {
  public static void main(String[] args) {
      LocalDateTime agora = LocalDateTime.now();

              System.out.println(agora);
      // 2021-04-06T21:42:00.873047743

      LocalDateTime futuro = agora.plusHours(1).plusDays(2).plusSeconds(12);

      System.out.println(futuro);
      // 2021-04-08T22:42:12.873047743
  }
}
Compartilhe
Comentários (3)

MM

Maria Moura - 01/08/2021 20:10

Obrigada pelo post. Ajuda muito!

Rogerio Macedo
Rogerio Macedo - 12/05/2021 08:57

Parabéns pela iniciativa! Feliz com esses(as) meninos(as) da comunidade DIO.

Rosemeire Deconti
Rosemeire Deconti - 07/04/2021 10:20

Gostei muito do seu artigo! Parabéns!