Dominando Data e Hora em Java: Construtores, Métodos e Boas Práticas
O Java fornece a classe Date disponível no pacote java.util, que encapsula a data e hora atuais.
A classe Date suporta dois construtores, conforme mostrado na tabela a seguir.
| Nº | Construtor e Descrição |
|---|---|
| 1 | Date() Este construtor inicializa o objeto com a data e hora atuais. |
| 2 | Date(long millisec) Este construtor aceita um argumento igual ao número de milissegundos decorridos desde a meia-noite de 1º de janeiro de 1970. |
A seguir estão os métodos da classe Date.
| Nº | Método e Descrição |
|---|---|
| 1 | boolean after(Date date) Retorna true se o objeto Date invocador contém uma data posterior à especificada por date; caso contrário, retorna false. |
| 2 | boolean before(Date date) Retorna true se o objeto Date invocador contém uma data anterior à especificada por date; caso contrário, retorna false. |
| 3 | Object clone() Duplica o objeto Date invocador. |
| 4 | int compareTo(Date date) Compara o valor do objeto invocador com o de date. Retorna 0 se os valores forem iguais. Retorna um valor negativo se o objeto invocador for anterior a date. Retorna um valor positivo se o objeto invocador for posterior a date. |
| 5 | int compareTo(Object obj) Opera de forma idêntica a compareTo(Date) se obj for da classe Date. Caso contrário, lança uma ClassCastException. |
| 6 | boolean equals(Object date) Retorna true se o objeto Date invocador contém a mesma hora e data que a especificada por date; caso contrário, retorna false. |
| 7 | long getTime() Retorna o número de milissegundos decorridos desde 1º de janeiro de 1970. |
| 8 | int hashCode() Retorna um código hash para o objeto invocador. |
| 9 | void setTime(long time) Define a hora e data conforme especificado por time, que representa um tempo decorrido em milissegundos desde a meia-noite de 1º de janeiro de 1970. |
| 10 | String toString() Converte o objeto Date invocador em uma string e retorna o resultado. |
Obtendo Data e Hora Atuais
Esta é uma maneira muito fácil de obter a data e hora atuais em Java. Você pode usar um objeto Date simples com o método toString() para imprimir a data e hora atuais da seguinte forma:
Exemplo
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instancia um objeto Date
Date date = new Date();
// Exibe hora e data usando toString()
System.out.println(date.toString());
}
}
Isso produzirá o seguinte resultado:
Saída
em 04 de Mai 09:51:52 CDT 2009
Comparação de Datas
A seguir estão as três maneiras de comparar duas datas:
Você pode usar getTime() para obter o número de milissegundos decorridos desde a meia-noite de 1º de janeiro de 1970 para ambos os objetos e então comparar esses dois valores.
Você pode usar os métodos before(), after() e equals(). Como o dia 12 do mês vem antes do dia 18, por exemplo, new Date(99, 2, 12).before(new Date(99, 2, 18)) retorna true.
Você pode usar o método compareTo(), que é definido pela interface Comparable e implementado por Date.
Formatação de Data Usando SimpleDateFormat
SimpleDateFormat é uma classe concreta para formatar e analisar datas de maneira sensível ao locale. O SimpleDateFormat permite que você comece escolhendo quaisquer padrões definidos pelo usuário para formatação de data-hora.
Exemplo
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
Date dNow = new Date();
SimpleDateFormat ft = new SimpleDateFormat("E yyyy.MM.dd 'às' hh:mm:ss a zzz");
System.out.println("Data Atual: " + ft.format(dNow));
}
}
Isso produzirá o seguinte resultado:
Saída
Data Atual: Dom 2004.07.18 às 04:14:09 PM PDT
Códigos de Formato SimpleDateFormat
Para especificar o formato de hora, use uma string de padrão de tempo. Neste padrão, todas as letras ASCII são reservadas como letras de padrão, definidas da seguinte forma:
| Caractere | Descrição | Exemplo |
|---|---|---|
| G | Designador de era | DC |
| y | Ano em quatro dígitos | 2001 |
| M | Mês no ano | Julho ou 07 |
| d | Dia no mês | 10 |
| h | Hora em A.M./P.M. (1~12) | 12 |
| H | Hora no dia (0~23) | 22 |
| m | Minuto na hora | 30 |
| s | Segundo no minuto | 55 |
| S | Milissegundo | 234 |
| E | Dia na semana | Terça-feira |
| D | Dia no ano | 360 |
| F | Dia da semana no mês | 2 (segunda Qua. em Julho) |
| w | Semana no ano | 40 |
| W | Semana no mês | 1 |
| a | Marcador A.M./P.M. | PM |
| k | Hora no dia (1~24) | 24 |
| K | Hora em A.M./P.M. (0~11) | 10 |
| z | Fuso horário | Horário Padrão do Leste |
| ' | Escape para texto | Delimitador |
| " | Aspas simples | ` |
Formatação de Data Usando printf
A formatação de data e hora pode ser feita facilmente usando o método printf. Você usa um formato de duas letras, começando com t e terminando em uma das letras da tabela, como mostrado no código a seguir.
Exemplo
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instancia um objeto Date
Date date = new Date();
// Exibe hora e data
String str = String.format("Data/Hora Atual: %tc", date);
System.out.printf(str);
}
}
Isso produzirá o seguinte resultado:
Saída
Data/Hora Atual: Sáb 15 Dez 16:37:57 MST 2012
Seria um pouco tolo se você tivesse que fornecer a data várias vezes para formatar cada parte. Por esse motivo, uma string de formato pode indicar o índice do argumento a ser formatado.
O índice deve seguir imediatamente o % e deve ser terminado por um $.
Exemplo
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instancia um objeto Date
Date date = new Date();
// Exibe data formatada
System.out.printf("%1$s %2$tB %2$td, %2$tY", "Data de vencimento:", date);
}
}
Isso produzirá o seguinte resultado:
Saída
Data de vencimento: Fevereiro 09, 2004
Alternativamente, você pode usar a flag <. Ela indica que o mesmo argumento da especificação de formato anterior deve ser usado novamente.
Exemplo
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instancia um objeto Date
Date date = new Date();
// Exibe data formatada
System.out.printf("%s %tB %<te, %<tY", "Data de vencimento:", date);
}
}
Isso produzirá o seguinte resultado:
Saída
Data de vencimento: Fevereiro 09, 2004
Caracteres de Conversão de Data e Hora
| Caractere | Descrição | Exemplo |
|---|---|---|
| c | Data e hora completas | Seg Mai 04 09:51:52 CDT 2009 |
| F | Data ISO 8601 | 2004-02-09 |
| D | Data formatada EUA (mês/dia/ano) | 02/09/2004 |
| T | Hora 24h | 18:05:19 |
| r | Hora 12h | 06:05:19 pm |
| R | Hora 24h, sem segundos | 18:05 |
| Y | Ano de quatro dígitos (com zeros à esquerda) | 2004 |
| y | Últimos dois dígitos do ano (com zeros à esquerda) | 04 |
| C | Primeiros dois dígitos do ano (com zeros à esquerda) | 20 |
| B | Nome completo do mês | Fevereiro |
| b | Nome abreviado do mês | Fev |
| m | Mês de dois dígitos (com zeros à esquerda) | 02 |
| d | Dia de dois dígitos (com zeros à esquerda) | 03 |
| e | Dia de dois dígitos (sem zeros à esquerda) | 9 |
| A | Nome completo do dia da semana | Segunda-feira |
| a | Nome abreviado do dia da semana | Seg |
| j | Dia do ano de três dígitos (com zeros à esquerda) | 069 |
| H | Hora de dois dígitos (com zeros à esquerda), entre 00 e 23 | 18 |
| k | Hora de dois dígitos (sem zeros à esquerda), entre 0 e 23 | 18 |
| I | Hora de dois dígitos (com zeros à esquerda), entre 01 e 12 | 06 |
| l | Hora de dois dígitos (sem zeros à esquerda), entre 1 e 12 | 6 |
| M | Minutos de dois dígitos (com zeros à esquerda) | 05 |
| S | Segundos de dois dígitos (com zeros à esquerda) | 19 |
| L | Milissegundos de três dígitos (com zeros à esquerda) | 047 |
| N | Nanosegundos de nove dígitos (com zeros à esquerda) | 047000000 |
| P | Marcador de manhã/tarde maiúsculo | PM |
| p | Marcador de manhã/tarde minúsculo | pm |
| z | Deslocamento numérico RFC 822 do GMT | -0800 |
| Z | Fuso horário | PST |
| s | Segundos desde 1970-01-01 00:00:00 GMT | 1078884319 |
| Q | Milissegundos desde 1970-01-01 00:00:00 GMT | 1078884319047 |
Existem outras classes úteis relacionadas a Data e Hora. Para mais detalhes, consulte a documentação padrão do Java.
Analisando Strings em Datas
A classe SimpleDateFormat possui alguns métodos adicionais, notavelmente parse(), que tenta analisar uma string de acordo com o formato armazenado no objeto SimpleDateFormat fornecido.
Exemplo
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
String input = args.length == 0 ? "1818-11-11" : args[0];
System.out.print(input + " Analisado como ");
Date t;
try {
t = ft.parse(input);
System.out.println(t);
} catch (ParseException e) {
System.out.println("Não analisável usando " + ft);
}
}
}
Uma execução de exemplo do programa acima produziria o seguinte resultado:
Saída
1818-11-11 Analisado como Qua Nov 11 00:00:00 EST 1818
Pausando a Execução
Você pode pausar por qualquer período de tempo, de um milissegundo até a vida útil do seu computador. Por exemplo, o programa a seguir pausaria por 3 segundos:
Exemplo
import java.util.*;
public class SleepDemo {
public static void main(String args[]) {
try {
System.out.println(new Date() + "\n");
Thread.sleep(3000);
System.out.println(new Date() + "\n");
} catch (Exception e) {
System.out.println("Exceção capturada!");
}
}
}
Isso produzirá o seguinte resultado:
Saída
Dom Mai 03 18:04:41 GMT 2009 Dom Mai 03 18:04:44 GMT 2009
Medindo Tempo Decorrido
Às vezes, você pode precisar medir um ponto no tempo em milissegundos. Vamos reescrever o exemplo acima mais uma vez:
Exemplo
import java.util.*;
public class DiffDemo {
public static void main(String args[]) {
try {
long inicio = System.currentTimeMillis();
System.out.println(new Date() + "\n");
Thread.sleep(3000);
System.out.println(new Date() + "\n");
long fim = System.currentTimeMillis();
long diff = fim - inicio;
System.out.println("Diferença é: " + diff);
} catch (Exception e) {
System.out.println("Exceção capturada!");
}
}
}
Isso produzirá o seguinte resultado:
Saída
Dom Mai 03 18:16:51 GMT 2009 Dom Mai 03 18:16:54 GMT 2009 Diferença é: 3003
Classe GregorianCalendar
GregorianCalendar é uma implementação concreta de uma classe Calendar que implementa o calendário gregoriano normal com o qual você está familiarizado. Não discutimos a classe Calendar neste tutorial; você pode consultar a documentação padrão do Java para isso.
O método getInstance() de Calendar retorna um GregorianCalendar inicializado com a data e hora atuais no locale e fuso horário padrão. GregorianCalendar define dois campos: AD e BC. Estes representam as duas eras definidas pelo calendário gregoriano.
Existem também vários construtores para objetos GregorianCalendar:
| Nº | Construtor e Descrição |
|---|---|
| 1 | GregorianCalendar() Constrói um GregorianCalendar padrão usando a hora atual no fuso horário padrão com o locale padrão. |
| 2 | GregorianCalendar(int year, int month, int date) Constrói um GregorianCalendar com a data dada definida no fuso horário padrão com o locale padrão. |
| 3 | GregorianCalendar(int year, int month, int date, int hour, int minute) Constrói um GregorianCalendar com a data e hora dadas definidas para o fuso horário padrão com o locale padrão. |
| 4 | GregorianCalendar(int year, int month, int date, int hour, int minute, int second) Constrói um GregorianCalendar com a data e hora dadas definidas para o fuso horário padrão com o locale padrão. |
| 5 | GregorianCalendar(Locale aLocale) Constrói um GregorianCalendar baseado na hora atual no fuso horário padrão com o locale dado. |
| 6 | GregorianCalendar(TimeZone zone) Constrói um GregorianCalendar baseado na hora atual no fuso horário dado com o locale padrão. |
| 7 | GregorianCalendar(TimeZone zone, Locale aLocale) Constrói um GregorianCalendar baseado na hora atual no fuso horário dado com o locale dado. |
Aqui está a lista de alguns métodos de suporte úteis fornecidos pela classe GregorianCalendar:
| Nº | Método e Descrição |
|---|---|
| 1 | void add(int field, int amount) Adiciona a quantidade (com sinal) de tempo especificada ao campo de tempo dado, baseado nas regras do calendário. |
| 2 | protected void computeFields() Converte UTC em milissegundos para valores de campo de tempo. |
| 3 | protected void computeTime() Sobrescreve Calendar. Converte valores de campo de tempo para UTC em milissegundos. |
| 4 | boolean equals(Object obj) Compara este GregorianCalendar com uma referência de objeto. |
| 5 | int get(int field) Obtém o valor para um campo de tempo dado. |
| 6 | int getActualMaximum(int field) Retorna o valor máximo que este campo poderia ter, dada a data atual. |
| 7 | int getActualMinimum(int field) Retorna o valor mínimo que este campo poderia ter, dada a data atual. |
| 8 | int getGreatestMinimum(int field) Retorna o valor mínimo mais alto para o campo dado se variar. |
| 9 | Date getGregorianChange() Obtém a data de mudança do Calendário Gregoriano. |
| 10 | int getLeastMaximum(int field) Retorna o valor máximo mais baixo para o campo dado se variar. |
| 11 | int getMaximum(int field) Retorna o valor máximo para o campo dado. |
| 12 | Date getTime() Obtém a hora atual deste Calendar. |
| 13 | long getTimeInMillis() Obtém a hora atual deste Calendar como um long. |
| 14 | TimeZone getTimeZone() Obtém o fuso horário. |
| 15 | int getMinimum(int field) Retorna o valor mínimo para o campo dado. |
| 16 | int hashCode() Sobrescreve hashCode. |
| 17 | boolean isLeapYear(int year) Determina se o ano dado é bissexto. |
| 18 | void roll(int field, boolean up) Adiciona ou subtrai (para cima/para baixo) uma única unidade de tempo no campo de tempo dado sem alterar campos maiores. |
| 19 | void set(int field, int value) Define o campo de tempo com o valor dado. |
| 20 | void set(int year, int month, int date) Define os valores para os campos ano, mês e data. |
| 21 | void set(int year, int month, int date, int hour, int minute) Define os valores para os campos ano, mês, data, hora e minuto. |
| 22 | void set(int year, int month, int date, int hour, int minute, int second) Define os valores para os campos ano, mês, data, hora, minuto e segundo. |
| 23 | void setGregorianChange(Date date) Define a data de mudança do GregorianCalendar. |
| 24 | void setTime(Date date) Define a hora atual deste Calendar com o Date dado. |
| 25 | void setTimeInMillis(long millis) Define a hora atual deste Calendar a partir do valor long dado. |
| 26 | void setTimeZone(TimeZone value) Define o fuso horário com o valor de fuso horário dado. |
| 27 | String toString() Retorna uma representação em string deste calendário. |
Exemplo
import java.util.*;
public class GregorianCalendarDemo {
public static void main(String args[]) {
String meses[] = {"Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"};
int ano;
// Cria um calendário gregoriano inicializado
// com a data e hora atuais no
// locale e fuso horário padrão.
GregorianCalendar gcalendar = new GregorianCalendar();
// Exibe informações de data e hora atuais.
System.out.print("Data: ");
System.out.print(meses[gcalendar.get(Calendar.MONTH)]);
System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
System.out.println(ano = gcalendar.get(Calendar.YEAR));
System.out.print("Hora: ");
System.out.print(gcalendar.get(Calendar.HOUR) + ":");
System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
System.out.println(gcalendar.get(Calendar.SECOND));
// Testa se o ano atual é bissexto
if(gcalendar.isLeapYear(ano)) {
System.out.println("O ano atual é bissexto");
} else {
System.out.println("O ano atual não é bissexto");
}
}
}
Isso produzirá o seguinte resultado:
Saída
Data: Abr 22 2009 Hora: 11:25:27 O ano atual não é bissexto
Para uma lista completa de constantes disponíveis na classe Calendar, consulte a documentação padrão do Java.
Java
- Classes e Objetos em C#: Fundamentos para POO Robusta
- Obter Data e Hora Atuais em Python: Guia Prático
- Variáveis e Literais em Java: Guia Completo
- Entendendo Expressões, Instruções e Blocos em Java
- Classes e Objetos em Java: Guia Prático
- Classes e Métodos Abstratos em Java: Guia Completo
- Dominando Classes Aninhadas e Internas em Java: Tipos, Exemplos e Boas Práticas
- Padrão Singleton em Java Explicado: Como Implementar e Usar com Segurança
- Java throw vs throws: Dominando Tratamento de Exceções com Exemplos Práticos
- Dominando Autoboxing e Unboxing em Java: Exemplos Práticos e Boas Práticas