Java - Data e hora
Java fornece a Data classe disponível em java.util pacote, esta classe encapsula a data e hora atuais.
A classe Date oferece suporte a dois construtores, conforme mostrado na tabela a seguir.
| Nº Sr. | Construtor e Descrição |
|---|---|
| 1 | Data( ) Esse construtor inicializa o objeto com a data e hora atuais. |
| 2 | Data (longo milissegundos) Esse construtor aceita um argumento que é 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 de data.
| Nº Sr. | Método e descrição |
|---|---|
| 1 | booleano após(data data) Retorna true se o objeto Date invocando contiver uma data posterior à especificada por date, caso contrário, retornará false. |
| 2 | booleano antes (data data) Retorna true se o objeto Date invocando contiver uma data anterior à especificada por date, caso contrário, retornará false. |
| 3 | Clone de objeto( ) Duplica o objeto Date de invocação. |
| 4 | int compareTo(data data) Compara o valor do objeto invocando com o valor de data. Retorna 0 se os valores forem iguais. Retorna um valor negativo se o objeto de invocação for anterior à data. Retorna um valor positivo se o objeto de invocação for posterior à data. |
| 5 | int compareTo(Object obj) Opera de forma idêntica a compareTo(Date) se obj for da classe Date. Caso contrário, ele lança uma ClassCastException. |
| 6 | boolean equals(data do objeto) Retorna true se o objeto Date que está invocando contiver a mesma hora e data que o especificado por date, caso contrário, retorna false. |
| 7 | longo 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 que está chamando. |
| 9 | void setTime(longo tempo) Define a hora e a data conforme especificado por time, que representa um tempo decorrido em milissegundos a partir da meia-noite de 1º de janeiro de 1970. |
| 10 | String toString( ) Converte o objeto Date que está chamando em uma string e retorna o resultado. |
Como obter data e hora atuais
Este é um método muito fácil de obter data e hora atuais em Java. Você pode usar um objeto Date simples com toString() método para imprimir a data e hora atuais da seguinte forma -
Exemplo
Demonstração ao vivo
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instantiate a Date object
Date date = new Date();
// display time and date using toString()
System.out.println(date.toString());
}
}
Isso produzirá o seguinte resultado -
Saída
on May 04 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, em seguida, 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 formatação e análise de datas de maneira sensível à localidade. SimpleDateFormat permite que você comece escolhendo qualquer padrão definido pelo usuário para formatação de data e hora.
Exemplo
Demonstração ao vivo
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 'at' hh:mm:ss a zzz");
System.out.println("Current Date: " + ft.format(dNow));
}
}
Isso produzirá o seguinte resultado -
Saída
Current Date: Sun 2004.07.18 at 04:14:09 PM PDT
Códigos de formato de data simples
Para especificar o formato de hora, use uma string de padrão de hora. Neste padrão, todas as letras ASCII são reservadas como letras padrão, que são definidas como a seguir -
| Personagem | Descrição | Exemplo |
|---|---|---|
| G | Designador de era | AD |
| s | 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 em hora | 30 |
| s | Segundo em minuto | 55 |
| S | Milisegundo | 234 |
| E | Dia na semana | terça-feira |
| D | Dia do ano | 360 |
| F | Dia da semana no mês | 2 (segunda quarta-feira de julho) |
| w | Semana do ano | 40 |
| W | Semana no mês | 1 |
| a | A.M./P.M. marcador | 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 com muita facilidade usando printf método. Você usa um formato de duas letras, começando com t e terminando em uma das letras da tabela conforme mostrado no código a seguir.
Exemplo
Demonstração ao vivo
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instantiate a Date object
Date date = new Date();
// display time and date
String str = String.format("Current Date/Time : %tc", date );
System.out.printf(str);
}
}
Isso produzirá o seguinte resultado -
Saída
Current Date/Time : Sat Dec 15 16:37:57 MST 2012
Seria um pouco bobo se você tivesse que fornecer a data várias vezes para formatar cada parte. Por isso, uma string de formato pode indicar o índice do argumento a ser formatado.
O índice deve seguir imediatamente o % e deve ser encerrado por um $.
Exemplo
Demonstração ao vivo
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instantiate a Date object
Date date = new Date();
// display time and date
System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);
}
}
Isso produzirá o seguinte resultado -
Saída
Due date: February 09, 2004
Alternativamente, você pode usar o sinalizador <. Indica que o mesmo argumento da especificação de formato anterior deve ser usado novamente.
Exemplo
Demonstração ao vivo
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instantiate a Date object
Date date = new Date();
// display formatted date
System.out.printf("%s %tB %<te, %<tY", "Due date:", date);
}
}
Isso produzirá o seguinte resultado -
Saída
Due date: February 09, 2004
Caracteres de conversão de data e hora
| Personagem | Descrição | Exemplo |
|---|---|---|
| c | Data e hora completas | Seg 04 de maio 09:51:52 CDT 2009 |
| F | Data ISO 8601 | 2004-02-09 |
| D | EUA data formatada (mês/dia/ano) | 02/09/2004 |
| T | Horário de 24 horas | 18:05:19 |
| r | 12 horas | 06:05:19 pm |
| R | Horário de 24 horas, sem segundos | 18:05 |
| S | Ano de quatro dígitos (com zeros à esquerda) | 2004 |
| a | Últimos dois dígitos do ano (com zeros à esquerda) | 04 |
| C | Os primeiros dois dígitos do ano (com zeros à esquerda) | 20 |
| B | Nome completo do mês | Fevereiro |
| b | Nome do mês abreviado | fevereiro |
| 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 com 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 |
| Eu | 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 | Milisegundos de três dígitos (com zeros à esquerda) | 047 |
| N | Nanossegundos de nove dígitos (com zeros à esquerda) | 047000000 |
| P | Marcador maiúsculo da manhã ou da tarde | PM |
| p | Marcador da manhã ou da tarde em minúsculas | pm |
| z | Deslocamento numérico RFC 822 do GMT | -0800 |
| Z | Fuso horário | PST |
| s | Segundos desde 01-01-1970 00:00:00 GMT | 1078884319 |
| Q | Milisegundos desde 01-01-1970 00:00:00 GMT | 1078884319047 |
Existem outras classes úteis relacionadas a Data e hora. Para obter mais detalhes, você pode consultar a documentação do Java Standard.
Analisando Strings em Datas
A classe SimpleDateFormat tem alguns métodos adicionais, notadamente parse( ), que tenta analisar uma string de acordo com o formato armazenado no objeto SimpleDateFormat fornecido.
Exemplo
Demonstração ao vivo
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 + " Parses as ");
Date t;
try {
t = ft.parse(input);
System.out.println(t);
} catch (ParseException e) {
System.out.println("Unparseable using " + ft);
}
}
}
Uma execução de amostra do programa acima produziria o seguinte resultado -
Saída
1818-11-11 Parses as Wed Nov 11 00:00:00 EST 1818
Dormindo um pouco
Você pode dormir por qualquer período de tempo de um milissegundo até a vida útil do seu computador. Por exemplo, o seguinte programa dormiria por 3 segundos -
Exemplo
Demonstração ao vivo
import java.util.*;
public class SleepDemo {
public static void main(String args[]) {
try {
System.out.println(new Date( ) + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date( ) + "\n");
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
Isso produzirá o seguinte resultado -
Saída
Sun May 03 18:04:41 GMT 2009 Sun May 03 18:04:51 GMT 2009
Medindo o tempo decorrido
Às vezes, pode ser necessário medir o ponto no tempo em milissegundos. Então vamos reescrever o exemplo acima mais uma vez -
Exemplo
Demonstração ao vivo
import java.util.*;
public class DiffDemo {
public static void main(String args[]) {
try {
long start = System.currentTimeMillis( );
System.out.println(new Date( ) + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date( ) + "\n");
long end = System.currentTimeMillis( );
long diff = end - start;
System.out.println("Difference is : " + diff);
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
Isso produzirá o seguinte resultado -
Saída
Sun May 03 18:16:51 GMT 2009 Sun May 03 18:16:57 GMT 2009 Difference is : 5993
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 Java padrão para isso.
O getInstance( ) O método de Calendar retorna um GregorianCalendar inicializado com a data e hora atuais na localidade 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º Sr. | Construtor e Descrição |
|---|---|
| 1 | GregorianCalendar() Constrói um GregorianCalendar padrão usando a hora atual no fuso horário padrão com a localidade padrão. |
| 2 | GregorianCalendar(int ano, int mês, int data) Constrói um GregorianCalendar com a data especificada definida no fuso horário padrão com a localidade padrão. |
| 3 | GregorianCalendar(int ano, int mês, int data, int hora, int minuto) Constrói um GregorianCalendar com a data e hora especificadas definidas para o fuso horário padrão com a localidade padrão. |
| 4 | GregorianCalendar(int ano, int mês, int data, int hora, int minuto, int segundo) Constrói um GregorianCalendar com a data e hora especificadas definidas para o fuso horário padrão com a localidade padrão. |
| 5 | GregorianCalendar(Locale aLocale) Constrói um GregorianCalendar com base na hora atual no fuso horário padrão com a localidade especificada. |
| 6 | GregorianCalendar(Fuso horário) Constrói um GregorianCalendar com base na hora atual no fuso horário determinado com a localidade padrão. |
| 7 | GregorianCalendar(TimeZone zone, Locale aLocale) Constrói um GregorianCalendar com base na hora atual no fuso horário determinado com a localidade especificada. |
Aqui está a lista de alguns métodos de suporte úteis fornecidos pela classe GregorianCalendar -
| Nº Sr. | Método e descrição |
|---|---|
| 1 | void add(campo int, valor int) Adiciona a quantidade de tempo especificada (assinada) ao campo de tempo determinado, com base nas regras do calendário. |
| 2 | protected void computeFields() Converte UTC como milissegundos em valores de campo de hora. |
| 3 | protegido void computeTime() Substitui o calendário Converte os valores do campo de tempo em UTC como milissegundos. |
| 4 | boolean equals(Object obj) Compara este GregorianCalendar com uma referência de objeto. |
| 5 | int get(int campo) Obtém o valor de um determinado campo de tempo. |
| 6 | int getActualMaximum(int campo) Retorna o valor máximo que esse campo pode ter, dada a data atual. |
| 7 | int getActualMinimum(int campo) Retorna o valor mínimo que este campo poderia ter, dada a data atual. |
| 8 | int getGreatestMinimum(int campo) Retorna o valor mínimo mais alto para o campo fornecido, se variar. |
| 9 | Data getGregorianChange() Obtém a data de alteração do Calendário Gregoriano. |
| 10 | int getLeastMaximum(int campo) Retorna o valor máximo mais baixo para o campo fornecido, se variar. |
| 11 | int getMaximum(int campo) Retorna o valor máximo para o campo fornecido. |
| 12 | Data getTime() Obtém a hora atual deste calendário. |
| 13 | longo getTimeInMillis() Obtém a hora atual deste calendário como um longo. |
| 14 | Fuso Horário getTimeZone() Obtém o fuso horário. |
| 15 | int getMinimum(int campo) Retorna o valor mínimo para o campo fornecido. |
| 16 | int hashCode() Substitui hashCode. |
| 17 | booleano isLeapYear(int ano) Determina se o ano fornecido é um ano bissexto. |
| 18 | void roll(campo int, boolean up) Adiciona ou subtrai (para cima/para baixo) uma única unidade de tempo no campo de tempo fornecido sem alterar campos maiores. |
| 19 | void set(campo int, valor int) Define o campo de hora com o valor fornecido. |
| 20 | void set(int ano, int mês, int data) Define os valores para os campos ano, mês e data. |
| 21 | void set(int ano, int mês, int data, int hora, int minuto) Define os valores para os campos ano, mês, data, hora e minuto. |
| 22 | void set(int ano, int mês, int data, int hora, int minuto, int segundo) Define os valores para os campos ano, mês, data, hora, minuto e segundo. |
| 23 | void setGregorianChange(Data data) Define a data de alteração de GregorianCalendar. |
| 24 | void setTime(Data data) Define a hora atual deste calendário com a data fornecida. |
| 25 | void setTimeInMillis(long millis) Define a hora atual deste calendário a partir do valor longo fornecido. |
| 26 | void setTimeZone(valor TimeZone) Define o fuso horário com o valor de fuso horário fornecido. |
| 27 | String toString() Retorna uma representação de string deste calendário. |
Exemplo
Demonstração ao vivo
import java.util.*;
public class GregorianCalendarDemo {
public static void main(String args[]) {
String months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
"Oct", "Nov", "Dec"};
int year;
// Create a Gregorian calendar initialized
// with the current date and time in the
// default locale and timezone.
GregorianCalendar gcalendar = new GregorianCalendar();
// Display current time and date information.
System.out.print("Date: ");
System.out.print(months[gcalendar.get(Calendar.MONTH)]);
System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
System.out.println(year = gcalendar.get(Calendar.YEAR));
System.out.print("Time: ");
System.out.print(gcalendar.get(Calendar.HOUR) + ":");
System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
System.out.println(gcalendar.get(Calendar.SECOND));
// Test if the current year is a leap year
if(gcalendar.isLeapYear(year)) {
System.out.println("The current year is a leap year");
}else {
System.out.println("The current year is not a leap year");
}
}
}
Isso produzirá o seguinte resultado -
Saída
Date: Apr 22 2009 Time: 11:25:27 The current year is not a leap year
Para obter uma lista completa de constantes disponíveis na classe Calendar, você pode consultar a documentação Java padrão.
Java