4

Trabalhando com Datas em Java

#Java
Gabriel Machado
Gabriel Machado

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


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
    }
}
1
38

Comentários (3)

0
M

Maria Moura

01/08/2021 20:10

Obrigada pelo post. Ajuda muito!

0
Rogerio Macedo

Rogerio Macedo

12/05/2021 08:57

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

1
Rosemeire Deconti

Rosemeire Deconti

07/04/2021 10:20

Gostei muito do seu artigo! Parabéns!

20 anos / Desenvolvedor na Seidor Brasil

Brasil