Manipulando Datas Em Java

Manipulando Datas Em Java

Introdução

A variável do tipo Date, que pertence ao pacote java.util, serve para representar um instante específico no tempo. E saber manipular variáveis desse tipo é muito importe por conta da sua demanda. O problema é que isso se torna um pouco mais difícil por conta do fuso horário. Será demonstrado a seguir como tratar então as variáveis do tipo Date em Java.

Date

A variável do tipo Date armazena um valor em milissegundos a partir da meia noite do dia 1 de janeiro de 1970 GMT (UTC). Ou seja, para criar uma variável que armazena 9 horas do dia citado anteriormente basta instanciar ela com o valor estático como citado anteriormente ou fazer como o exemplo a seguir:

Date dataFechamento = new Date (1000L * 60L * 60L * 9L);
System.out.println(dataFechamento);

Sendo o 1000 equivalente aos milissegundos, os dois 60 equivalentes aos segundos e minutos, e o 9 equivale as horas.

SimpleDateFormat

SimpleDateFormat é a classe utilizada para conversões entre Date e String. Essa classe permite que a data armazenada no banco seja exibida no formato desejável. Como por exemplo:

SimpleDateFormat sdf1 = new SimpleDateFormat(“dd/MM/yyyy”);
Date x1 = sdf1.parse(“25/06/2018”);
System.out.println("x1: " + x1);

SimpleDateFormat sdf2 = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Date x2 = new Date();
System.out.println("x2: " + sdf2.format(x2));

No primeiro exemplo é criado uma variável de acordo com uma data fixa, considerando dia, mês e ano. Já no segundo é criado uma variável com a data local da máquina, considerando também a hora, os minutos e os segundos.

Padrão ISO 8601

Para se ter mais segurança, é recomendado utilizar o padrão ISO 8601 determina o formato yyyy-MM-ddTHH:mm:ssZ. Um exemplo disso é a data 2021-04-07T14:54:15Z. O Z no final significa que está no horário UTC. Na hora de exibir esse horário na tela, ele é convertido por padrão para o fuso horário correspondente daquela região.

A classe Instant permite instanciar uma variável do tipo date a partir de uma data no formato da ISO 8601. Por exemplo:

Date dataFimProva = Date.from(Instant.parse(“2021-04-07T14:54:15Z”));
System.out.println("Data do fim da prova: " + dataFimProva );

Deste modo, é possível armazenar no banco de dados a data sempre no formato UTC e converter para o fuso horário local do usuário de acordo com sua localidade.

Fixando Fuso Horário

É possível também fixar um fuso horário na hora de exibir essa data. No exemplo a seguir, é demonstrado como fixar o fuso horário no padrão GMT (UTC).

SimpleDateFormat sdf3 = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
sdf3.setTimeZone(TimeZone.getTimeZone("GMT"));
Date dataVenda = Date.from(Instant.parse("2021-04-07T14:54:15Z"));        
System.out.println("Data da venda em GMT: " + sdf3.format(dataVenda));

Calendar

A biblioteca Calandar serve para auxiliar os programadores Java a manipular as variáveis do tipo Date em Java. Essa biblioteca já é um pouco antiga, e é possível encontrar algumas bibliotecas melhores para fazer essa função. Acontece que o estudo desta se torna válido pelo motivo de que muitos sistemas já foram desenvolvidos utilizando ela.

A seguir um exemplo de como somar dois dias em uma determinada data.

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Date dataTeste = Date.from(Instant.parse("2021-04-07T02:54:15Z"));    
System.out.println("dataTeste: " + sdf.format(dataTeste));

Calendar cal = Calendar.getInstance();
cal.setTime(dataTeste);
cal.add(Calendar.HOUR_OF_DAY, 2);
dataTeste = cal.getTime();
System.out.println("dataTeste: " + sdf.format(dataTeste));

Além disso, é possível também extrair um valor especifico, como os minutos e o mês de uma determinada data, como demonstra o exemplo a seguir:

int minutos = cal.get(Calendar.MINUTE);
int mes = 1 + cal.get(Calendar.MONTH);

System.out.println("Minutos: " + minutos);
System.out.println("Mês: " + mes);

Nota-se que no caso do mês, foi somado uma unidade ao valor final. Isto deve-se ao fato de que a biblioteca considera o inicio da contagem dos meses no 0.

Conclusão

Recomenda-se então armazenar as datas sempre no formato da ISO 8601 para que se tenha sempre uma data padrão independente do fuso horário, para isso a biblioteca Instant pode ajudar. E na hora de exibir esses valores na tela, utilizar a biblioteca SimpleDateFormat é ótimo para formatar essas datas da melhor maneira possível para os usuários. A biblioteca Calendar pode ajudar muito quando se precisa manipular essas datas, e apesar de ser uma biblioteca já antiga, ainda existem muitos sistemas que a utilizam.