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.
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 |
|---|---|
|
|
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:
- O ano deve ser contado a partir de 1900.
- Os meses são numerados a partir do zero.
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
Retorna o ano da data relativo a 1900. |
|
Retorna o mês da data (os meses são numerados a partir de zero) |
|
Retorna o dia do mês |
|
Retorna o dia da semana |
|
Retorna as horas |
|
Retorna os minutos |
|
Retorna os segundos |
Exemplo:
| Código | Saída do console | Observação |
|---|---|---|
|
|
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 |
|---|
|
| Saída do console |
|
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.
GO TO FULL VERSION