1. Dateaula e hora do Unix

Desde o início de Java, a linguagem tem uma classe especial para trabalhar com horas e datas — Date. Com o tempo, várias outras classes para trabalhar com datas apareceram, mas os programadores continuam usando a Dateclasse até hoje.

Isso ocorre porque é muito simples e conveniente. E como programador, você definitivamente o encontrará em qualquer projeto real. Usar ou não é uma escolha sua, mas você deve saber. Então dê a ele alguns minutos do seu precioso tempo.

O que torna a Dateaula tão boa? Sua simplicidade.

A Dateclasse armazena informações de data e hora como o número de milissegundos decorridos desde 1º de janeiro de 1970. São muitos milissegundos, portanto, o longtipo é usado para armazená-los.

Interessante.

Por que desde 1970 especificamente? Este é o chamado tempo Unix : é como o sistema operacional Unix, que é o avô de todos os sistemas operacionais modernos, marca o tempo.

Mas você pode descobrir com muita facilidade quanto tempo se passou entre duas datas: basta subtrair uma data da outra e obter a diferença de tempo entre as datas até o milissegundo mais próximo.

Aqui estão alguns exemplos úteis de como trabalhar com a Dateclasse.


2. Obtendo a data atual

Para obter a hora e a data atuais, basta criar um Dateobjeto. Cada novo objeto armazena a hora em que foi criado. Parece muito simples:

Date current = new Date();

Depois de executar este comando, a currentvariável armazenará uma referência ao Dateobjeto criado, que armazenará internamente o tempo de sua criação — o número de milissegundos decorridos desde 1º de janeiro de 1970.

Exibindo a data atual na tela

Para exibir a data atual, basta: a) criar um novo Dateobjeto, b) imprimi-lo na tela usando o System.out.println()método .

Exemplo:

Código Saída do console
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

Aqui está o que a saída do console significa:

Texto Interpretação
quinta -feira Quinta-feira
21 de fevereiro 21 de fevereiro
14:01:34 horas: minutos: segundos
EET Fuso horário: Horário da Europa Oriental
2019 Ano

3. Definindo uma data específica

Descobrimos como obter a hora atual, mas como criamos um Dateobjeto que armazena uma data ou hora diferente?

Novamente, tudo é simples aqui. Para definir uma data específica, você precisa escrever um código como este:

Date birthday = new Date(year, month, day);

Tudo é simples e óbvio, mas há duas nuances a serem observadas:

  1. O ano deve ser contado a partir de 1900.
  2. Os meses são numerados a partir do zero.
Interessante.

Este é outro legado do sistema operacional Unix: no Unix, os programadores indicavam o ano usando dois dígitos. Em vez de 1977, eles simplesmente escreveram 77. Portanto, 77 é o ano correto se contarmos a partir de 1900.

Por exemplo, nasci em 21 de março de 1989. Março é o terceiro mês, então preciso escrever:

Código Saída do console
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

Os meses são numerados a partir do zero, mas os dias não. Isso é um pouco estranho, certo?

Achamos que os verdadeiros programadores deveriam ter prevalecido e numerado os dias do mês a partir do zero também. Oh, esses conformistas 🙂

Definindo um horário específico

Definir um horário específico também é bastante simples: para isso, você precisa escrever uma declaração como esta:

Date birthday = new Date(year, month, day, hour, minutes, seconds);

Horas, minutos e segundos são numerados a partir do zero: deixe o programador dentro de você respirar aliviado.

Exemplo:

Código Saída do console
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

Marcamos a hora 12h15 e a data 4 de junho de 2005 . Isso é um pouco difícil para um não programador ler, mas funciona como deveria.


4. Trabalhando com elementos de uma data

Você pode fazer mais com um Dateobjeto do que apenas exibi-lo. Possui métodos que permitem obter elementos individuais da data armazenada internamente:

Método Descrição
int getYear()
Retorna o ano da data relativo a 1900.
int getMonth()
Retorna o mês da data (os meses são numerados a partir de zero)
int getDate()
Retorna o dia do mês
int getDay()
Retorna o dia da semana
int getHours()
Retorna as horas
int getMinutes()
Retorna os minutos
int getSeconds()
Retorna os segundos

Exemplo:

Código Saída do console Observação
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current.getYear());
System.out.println(current.getMonth());
System.out.println(current.getDate());
System.out.println(current.getDay());

105
5
4
6

2005
junho
dia do mês
sábado

A propósito, um Dateobjeto não apenas permite obter elementos individuais de uma data, mas também alterá-los:

Método Descrição
void setYear(int year) Altera o ano da data. O ano é indicado em relação a 1900.
void setMonth(int month) Altera o mês da data (os meses são numerados a partir de zero)
void setDate(int date) Muda o dia do mês
void setHours(int hours) Muda o horário
void setMinutes(int minutes) Minutos de alterações
void setSeconds(int seconds) Muda os segundos

5. Milissegundos

Como dissemos anteriormente, o Dateobjeto armazena o número de milissegundos decorridos desde 1º de janeiro de 1970.

Se precisarmos desse número, podemos obtê-lo do Dateobjeto:

long time = date.getTime();

O getTime()método retorna o número de milissegundos armazenados dentro do Dateobjeto.

Você não apenas pode obter o número de milissegundos, mas também pode alterar esse número em um objeto existente:

Date date = new Date();
date.setTime(1117876500000L);

A propósito, você pode escrever isso de forma ainda mais concisa passando o tempo para o Dateobjeto logo que ele é criado:

Date date = new Date(1117876500000L);

6. Comparação de datas

Se você quiser comparar duas datas e descobrir qual veio primeiro, você tem três opções

A primeira maneira é simplesmente comparar o número de milissegundos que cada um armazena:

if (date1.getTime() < date2.getTime())

A segunda maneira é usar o before()método de um Dateobjeto:

if (date1.before(date2))

Fica assim: se date1vem antes de date2, então...

A terceira maneira é usar o after()método de um Dateobjeto:

if (date2.after(date1))

Fica assim: se date2for depois de date1, então...


7. DateFormataula

Lembre-se, quando exibimos a data na tela, vimos algo assim: Thu Feb 21 14:01:34 EET 2019. Tudo parece correto, mas o formato é mais como uma data seria exibida para programadores do que para humanos normais. Queremos exibir a data de forma mais clara para os usuários. Algo como Tuesday, February 21.

E sem o ano. Ou com um ano, se necessário. Em geral, queremos poder exibir a data de maneiras diferentes.

Existe uma aula especial para isso: SimpleDateFormat.

Exemplo:

Código
Date current = new Date(105, 5, 4, 12, 15, 0);
SimpleDateFormat formatter = new SimpleDateFormat("MMM-dd-YYYY");
String message = formatter.format(current);
System.out.println(message);
Saída do console
Jun-04-2005

Olha o que o programa exibiu: Jun-04-2005. Isso não é nada do que costumava ser.

A diferença é que exibimos não o Dateobjeto em si, mas uma string especial obtida chamando o format()método em um SimpleDateFormatobjeto. Mas esse nem é o ponto principal aqui.

Quando o SimpleDateFormatobjeto foi criado, passamos a string "MMM-dd-YYYY"como parâmetro. É essa string que transmite o formato de data que finalmente vimos na saída do console.

  • MMM indica para exibir o nome do mês, abreviado usando três letras
  • dd indica para exibir o dia do mês
  • YYYY indica para exibir o ano usando quatro dígitos

Se quisermos exibir o mês como números, em vez de MMM, precisamos escrever MM, o que resulta no padrão "MM-dd-YYYY". A saída da tela será06-04-2005

Discutiremos essa classe com mais detalhes posteriormente.


8. Date.parsemétodo

A Dateclasse pode fazer algo mais interessante e útil — pode obter uma data de uma string. Ou, como dizem os programadores, pode analisar uma string.

Tem o parse()método especial para isso. A análise fica assim:

Date date = new Date();
date.setTime( Date.parse("Jul 06 12:15:00 2019") );

A propósito, este código pode ser escrito de forma mais compacta:

Date date = new Date("Jul 06 12:15:00 2019");

Consideraremos a análise de strings com mais detalhes em outras lições.