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