Como lidar com Datas e Horas em Java

Sobre estas Mini Aulas

A partir deste primeiro artigo, pretendo criar alguns posts rápidos sobre conteúdos que ministro na minhas aulas da ETEP.

Para quem caiu de pára-quedas, sou o Prof. Luís Eduardo, e leciono na ETEP Faculdades de São José dos Campos e mantenho este blog com coisas de meu interesse e algum conteúdo das minhas aulas. Coisas de meu interesse: Astronomia, Astronáutica, Livros, Filmes, etc.

Moby Dick download Já tenho no site um curso completo de Java Web e um quase completo video-curso de Asp.net.

Estes cursos eu acabo utilizando em minhas aulas e tem dado bom resultado. No entanto no decorrer das aulas, verifiquei que alguns pontos ficam faltando. Estes detalhes virão com pírulas nestes artigos que vou publicar aos poucos.

Lidando com Datas e Horas em Java

Hoje vou falar um pouco como lidar com valores de data em Java.

java.util.Date

Primeiro nós temos a classe Date em java.util que representa uma data simples em java. Podemos criar uma variável data assim:

java.util.Date x;

Se colocarmos import java.util.*; poderemos omitir na declaração da variável ficando assim:

Date x;

Onde colocar o import? Vá fazer uma revisão em minha aula sobre java básico.

Assim podemos criar um objeto para armazenar nesta variável:

x=new Date();

No momento da criação do objeto Date, o sistema armazena no mesmo a Data/Hora do relógio do computador. Podemos então mostrar a hora atual:

Date x=new Date();
System.out.println(x); //resultado em minha máquina: Fri Jun 05 22:43:25 BRT 2009

java.text.SimpleTextFormat()

Mas como colocar uma data digitada pelo usuário em uma variável Date? Temos que usar conversores. A classe java.text.SimpleTextFormat() nos servirá:

import java.util.*;
import java.text.*;
...
String x=request.getParameter("dataUsuario"); //pegando dados de um formulário WEB
SimpleDateFormat sdf1= new SimpleDateFormat("dd/MM/yyyy"); //você pode usar outras máscaras
Date dataUsuario=sdf1.parse(stx);

O contrário também é importante: mostrar a data em forma de texto. SimpleDateFormat também serve para isso:

String x=request.getParameter("dataUsuario"); //pegando dados de um formulário WEB
SimpleDateFormat sdf1= new SimpleDateFormat("dd/MM/yyyy"); //você pode usar outras máscaras veja documentação abaixo
Date y=new Date();
System.out.println(sdf1.format(y)); //Saída 20/05/2009

java.util.GregorianCalendar

A classe Date é bem simples e serve para armazenar datas apenas. Ainda temos que manipular as datas não é? Tipo acrescentar 10 dias, verificar qual o dia da semana, e coisas assim. Para isso vamos usar a classe GregorianCalendar.

        GregorianCalendar gc=new GregorianCalendar();

Como a classe Date, quando um objeto é criado a data/hora do sistema é assumido automaticamente. Algumas funções da classe são muito úteis. Vamos dar uma olhada:

GET. Obter o valor de um dos componentes da Data, como dia da semana, dia do mês, hora, mês ou qualquer outra coisa:

        GregorianCalendar gc=new GregorianCalendar();
        System.out.println(gc.get(gc.DAY_OF_WEEK)); //Mostra qual o dia da semana 1=domingo, 2=segunda, etc

Além do dia da semana, é possível mostrar a hora (gc.HOUR), minuto (gc.MINUTES), etc. Veja na documentação abaixo os outros valores de campo disponíveis.

ADD. Adicionar um ou mais dias, horas, mês ou qualquer outra coisa a uma data:

        GregorianCalendar gc=new GregorianCalendar();
        gc.add(gc.MONTH, 2); //Adiciona 2 meses à data atual

Além de gc.MONTH, é possível adicionar horas (gc.HOUR), minutos (gc.MINUTES), etc. É lógico que adicionando valores negativos, você subtrai os valores!

IS LEAP YEAR. Verifica se um ano é bissexto.

        GregorianCalendar gc=new GregorianCalendar();
        System.out.println(gc.isLeapYear(2009)); // imprime falso. 2009 não é bissexto.

Acho que já deu para entender como funciona. Outras funções disponíveis:

    A Sister’s Secret hd
  • SET – mudar o valor de uma data. gc.set(10,03,2009); ou gc.set(10,03,2009,10,30); ou gc.set(gc.HOUR,11);
  • AFTER/BEFORE – verificar se um data é depois ou antes de outrar. gc.after(gc2) gc é depois de gc2?
  • GETMAXIMUN – obter o maior valor disponível para um campo considerando os valores atuais dos outros. gc.getMaximum(gc.DATE); retornaria 28 se o mês fosse fevereiro de um ano não bissexto.

Por fim, para juntar os dois, GregorianCalendar e Date, utilizamos duas funções:

GregorianCalendar gc=new GregorianCalendar();
Date d1=gc.getTime(); //"Pega" a data do GregorianCalendar para uma variável Date
gc.setTime(d1); //Armazena a data de d1 para o GregorianCalendar gc.

Mais informações sobre Date, GregorianCalendar e SimpleDateFormat você pode encontrar na documentação do Java em inglês:

E é isso. Espero que eu tenha sido claro. Qualquer dúvida deixe aí para mim nos comentários, que farei o possível para esclarecer. Bons estudos.

Outros Artigos:

3 comentários para “Como lidar com Datas e Horas em Java”

  1. Allan Souza de Jesus disse:

    Muito legal o seu artigo, e aproveito para perguntar como faço para tratar a data de fevereiro. Exemplo: estamos desenvolvendo um trabalho na faculdade e quando inserimos a data 31/02/2209, ele tranforma a data para 02/03/2009, qual a tratativa que devo fazer para não aceitar essa data.

    Grato,

    Allan.

  2. Débora disse:

    Cara, esse teu post foi ótimo!!!!
    Bem aquilo que eu precisava! Li seu post, implementei meu código e bingo!!!CertinhoO!!!
    Cara, parabéns!!!

  3. Cristian disse:

    Site com conteudo muito bom, ja coloquei nos meus favoritos,
    parabens

Deixe um comentário