Java e Datas

Voltando a ativa, tendo em vista a dificuldade que as pessoas que estão iniciando com java tem com manipulação de datas e também a sugestão de alguns dos meus alunos, decidi criar um post sobre datas em Java.

Neste post explicarei como utilizar as classes java.util.Date, java.util.GregorianCalendar e java.text.SimpleDateFormat.

java.util.Date

A Classe java.util.Date serve para armazenar uma data em específico. É uma classe simples, e muitos componentes de bibliotecas e Frameworks utilizam esta classe.

Para instanciar uma nova data, basta utilizar o comando:

Date data = new Date();

Não esquecendo, claro, de importar a Classe.

A data é instanciada com a data atual do computador.

O problema é quando é necessário alterar a data para um dia, mês ou ano em específico. Os métodos setMonth, setDate e setYear estão depreciados, pois o ano é acrescentado automaticamente a 1900.

Isto funcionava muito bem antes do ano 2000, pois se fosse para setar o ano para 1997, bastava fazer um setYear( 97 ). Agora para 2006, é necessário fazer um setYear( 106 ). Não é muito bonito.

O ideal é usar a classe GregorianCalendar que implementa o calendário gregoriano, como veremos mais a frente.

java.text.SimpleDateFormat

A classe java.text.SimpleDateFormat é uma classe utilitária que serve para converter tanto de String para Date quanto de Date para String. Muito útil quando tem que transformar um campo digitado pelo usuário para Date ou mostrar uma data em um formato em específico.

Para utilizar a classe


//instancia o objeto passando no construtor a máscara da data
SimpleDateFormat sdf = new SimpleDateFormat( "dd/MM/yyyy" );

//Para converter de String para Date:
java.util.Date data = sdf.parse("21/04/2011");

//converter de Date para String
String data = sdf.format( data );

java.util.GregorianCalendar

Quando é necessário efetuar operações com datas, a classe Date já não serve muito bem. A classe GregorianCalendar, além de ajustar alguns problemas que ocorrem com a classe Date, serve para efetuar operações mais complexas com datas.

Para instanciar um objeto do tipo GregorianCalendar:

//construtor sem argumentos
GregorianCalendar data = new GregorianCalendar();

Da mesma forma que um Date, o GregorianCalendar vem como padrão a data atual do sistema.

Um outro construtor da classe permite passar o ano, mês e dia da data:

//construtor que recebe o ano, mes e dia
GregorianCalendar data2 = new GregorianCalendar( 2011, 0, 1 );

Um detalhe importante é que o mês vai de 0 (janeiro) a 11 (dezembro).

Métodos de manipulação de data:

data.set( campo, valor )

Este método seta o valor de um campo específico. Os campos são constantes da classe, conforme abaixo:


//altera o dia para 1
data.set( GregorianCalendar.DAY_OF_MONTH , 1);

//altera o mês para abril
data.set( GregorianCalendar.MONTH , 3);

//altera o ano para 2012
data.set( GregorianCalendar.YEAR , 2012);

data.get( campo )

Este método retorna um campo específico da data. Os campos são as mesmas constantes listadas no exemplo do método set acima:


int dia = data.get( GregorianCalendar.DAY_OF_MONTH );
int mes = data.get( GregorianCalendar.MONTH );

data.add( campo, valor )

Este método adiciona um valor a um campo. Exemplo:

//adiciona 2 meses a data atual
data.add( GregorianCalendar.MONTH , 2);

data.before( outraData ) e data.after( outraData )

Este método verifica se uma data é anterior ou posterior a outra data.

Exemplo:

//construtor sem argumentos
GregorianCalendar data = new GregorianCalendar();

//construtor que recebe o ano, mes e dia
GregorianCalendar data2 = new GregorianCalendar( 2011, 0, 1 );

if ( data.after( data2 ) ){
 //caso a data seja após a data 2, entra neste IF
}

Convertendo entre Date e GregorianCalendar

Para converter um objeto de Date para GregorianCalendar:

//objeto do tipo Date
Date date = new Date();

//cria o GregorianCalendar e utiliza o método setTime
GregorianCalendar gc = new GregorianCalendar();
gc.setTime( date );

Para converter um objeto de GregorianCalenda para Date:

Date date = gc.getTime();

O método getTime() do GregorianCalendar retorna um objeto do tipo Date.


Resolvendo operações de dias, meses e anos entre datas

Tanto as classes Date como GregorianCalendar possuem métodos para retornar a data em milissegundos passados desde a data de 1/jan/1970.

Na classe Date, o método se chama getTime;
Em GregorianCalendar, o método se chama getTimeInMillis;

A partir disto, é possível calcular, em milissegundos, a diferença entre uma data e outra., para então converter para dias, meses, anos e etc.

Exemplo com GregorianCalendar:


long milissegundos = gc.getTimeInMillis() - gc2.getTimeInMillis();
long dias = milissegundos / (24*60*60*1000);

Mas o que significa esses números?

É que a diferença é em milissegundos. Para chegar a dias, é necessário dividir por milissegundos (1000), por segundos (60), por minutos (60) e por horas (24).

Espero ter ajudado.

Abraço!

Deixe um Comentário

9 Comentários.

  1. Muito Bom
    Parabéns 🙂

  2. Excelente post Hallan. Realmente, data é uma coisa que tem muita gente que se atrapalha. Parabens pela iniciativa.
    Abraço.

  3. Valeu Hallan ajudou bastante.

  4. Muito bom, ajudou muito.
    Obrigada.

  5. Opa, ótimo tutorial Hallan, gostei muito, me ajudou no meu projeto aonde trabalho, no Tribunal de Justiça de Santa Catarina!

  6. Roberto de Viveiros Cardozo

    Boa fonte de consulta, resolveu o meu problema.

  7. Como faço para comparar se uma data é menor que a outra e executar uma ação se for? com gregoricalendar ????
    exemplo logico: datadeentrega= 01/05/2014
    dataatual= 01/10/2014
    if ( datadeentrega<= dataatual) {
    System.out.println("ja foi devolvida");
    }

    • Boa tarde,

      Você pode utilizar os métodos “before” e “after” do gregorian calendar para esta verificação.
      Ex: if (datadeentrega.before(dataatual) {
      //data de entrega é antes da data atual
      }

      Um abraço

Deixe um Comentário


NOTA - Você pode usar estesHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>