Manipulando datas em Java
Para quem está começando, trabalhar com datas em Java pode ser um pouco complicado, já que a classe Date
não fornece todos os recursos necessários. Para completá-la é também utilizada a classe Calendar
, que é uma classe abstrata que permite a manipulação de datas de forma mais fácil.
Date(java.util.Date)
A classe Date
armazena uma data e hora, que internamente é armazenada com um inteiro long que é o número de milissegundos que se passou desde 01/01/1970.
Esta classe é bem simples de se trabalhar, mas muitos de seus métodos foram depreciados por não trabalhar muito bem com internacionalização e etc.
Para obter a data atual se basta criar um objeto Date
sem nenhum parâmetro.
Date d = new Date();
Calendar(java.util.Calendar)
A classe Calendar
sendo uma classe abstrata não pode ser instanciada com o operador new
, ela deve ser criada utilizando um operador estático sobrecarregado getInstance()
. Na maioria das vezes você vai receber uma instância de java.util.GregorianCalendar
.
Calendar c = Calendar.getIntance();
Com a instância de Calendar devemos configurar uma data e podemos fazer isso de duas formas:
Métodos set
c.set(ano,mes,dia);
c.set(ano,mês,dia,hora,minuto);
c.set(ano,mês,dia,hora,minuto,segundo);
Método setTime
c.setTime(new Date() );
A classe Calendar
também nos fornece várias constantes que utilizaremos para manipular uma data entre elas.
Com a data devidamente configurada podemos realizar diversas operações com a data:
Para adicionar ou subtrair um dia, hora, mês ou ano utilizamos o método add
. O método add
aceita dois parâmetros, sendo o primeiro um constante inteira que representa a unidade da data que queremos modificar(dia, mês , ano, etc…) e o segundo quantas vezes será adicionada/subtraída esta unidade.
A unidade é informada utilizando constantes fornecidas pela classe Calendar
que pode ser:
Dia:
Calendar.DAY_OF_MONTH
Calendar.DAY_OF_WEEK
Calendar.DAY_OF_YEAR
Mês:
Calendar.MONTH
Ano:
Calendar.YEAR
Hora:
Calendar.HOUR Calendar.HOUR_OF_DAY
Segundos:
Calendar.SECOND
Veja o exemplo abaixo:
Date d= new Date();
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_YEAR,5 );//adicionamos 5 dias a data aual
c.add(Calendar.MONTH,3 );//adicionamos 3 mêses a data atual
c.add(Calendar.YEAR,1 );//adicionamos 1 ano a data atual
DateFormat(java.text.DateFormat)
Bom agora sabemos como manipula datas, agora precisamos formatar a data para apresentação. A classe DateFormat
nos fornece uma maneira simples de formatá-la e permite a internacionalização a partir da classe Locale
.
Date d = new Date();
Calendar c = Calendar.getInstance();
c.setTime(d);
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
System.out.println( df.format(c.getTime()) );
Para obtermos uma String da data utilizamos o método format
que retorna uma String no formato especificado no método getDateInstance()
. A saída do exemplo acima será algo como 03/04/10.
A classe DateForma
nos fornece vários tipos de formato para data como:
Dateformat.SHORT // 03/04/10
Dateformat.MEDIUM // 03/04/2010
Dateformat.LONG //3 de Abril de 2010
Dateformat.FULL //Sábado, 3 de Abril de 2010
Embora para muitos casos estes formatos serão suficientes algumas vezes necessitamos de uma formato bem personalizado. Isso pode ser feio através de um subclasse de DateFormat
a SimpleDateFormat
.
Date hoje = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
System.out.println( sdf.format(hoje));
O construtor de SimpleDateFormat
recebe uma String que representa o formato da data. Os símbolos utilizados para cada campo da data pode ser visto na tabela abaixo abaixo:
Símbolo | Significado | Apresentação | Exemplo |
G | era designator | (Text) | AD |
y | year | (Number) | 1996 |
M | month in year | (Text & Number) | July & 07 |
d | day in month | (Number) | 10 |
h | hour in am/pm (1~12) | (Number) | 12 |
H | hour in day (0~23) | (Number) | 0 |
m | minute in hour | (Number) | 30 |
s | second in minute | (Number) | 55 |
S | millisecond | (Number) | 978 |
E | day in week | (Text) | Tuesday |
D | day in year | (Number) | 189 |
F | day of week in month | (Number) | 2 (2nd Wed in July) |
w | week in year | (Number) | 27 |
W | week in month | (Number) | 2 |
a | am/pm marker | (Text) | PM |
k | hour in day (1~24) | (Number) | 24 |
K | hour in am/pm (0~11) | (Number) | 0 |
z | time zone | (Text) | Pacific Standard Time |
Como vimos o dia da semana pode ser escrito por extenso, que língua ele será utilizada? Normalmente o inglês, mas se quisermos que seja na língua de um local diferente?
Para isso utilizaremos a internacionalização com a classe Locate
que recebe em seu construtor a língua e o país que queremos utilizar:
Locale brasil = new Locale("pt","br");//portugues do brasil
Locale japao = new Locale("ja");// japao
O objeto locale de Locale
pode ser utilizado tanto com a classe DateFormat
quanto com a classe SimpleDateFormat
.
Date hoje = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("E dd ",new Locale("pt","br"));
System.out.println( sdf.format(hoje));
DateFormat df = DateFormat.getDateInstance(DateFormat.FULL,new Locale("pt","br"));
System.out.println( df.format(hoje));
Para finalizar como convertermos uma String em um objeto Date
.
Date d = new Date();
SimpleDateFormat df = new SimpleDateFormat("DD/MM/yyyy");
try {
d = df.parse("25/03/2010");
} catch (ParseException ex) {
ex.printStackTrace();
}
System.out.println( df.format(d));
O método parse
da classe DateFormat
e SimpleDateFormat
recebe uma string e converte para um objeto Date
.