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 vivoimport 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 vivoimport 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 vivoimport 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 vivoimport 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 vivoimport 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 vivoimport 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 vivoimport 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 vivoimport 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 vivoimport 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