quarta-feira, 19 de setembro de 2007

Trabalhando com Datas no Java

Agora vamos explorar outro terreno fértil do Java: Datas!

Muita gente usa a classe Date (java.util.Date) pra trabalhar com cálculo de datas. Porém, com o tempo, a classe Date foi ficando velha, foi ficando aquém das necessidades dos usuários. Tanto que, dos 6 construtores da classe, só dois ainda não estão marcados como deprecated, e dos métodos, apenas 10 dos 28 estão ativos ainda (incluindo métodos herdados de Object, como clone() e equals()).

Porém o Date ainda não morreu. O ideal, segundo alguns autores, é utilizar a classe Date (não confundir com java.sql.Date) para armazenar valores de data, não para realizar cálculos e coisas do gênero. Para isso, é recomendável o pacote Calendar e seu filhote, GregorianCalendar \o/

Falar é fácil, vamos aos códigos:

Pegar a data de hoje:


//Usando Date
Date hoje = new Date();
//Usando GregorianCalendar
Date hoje = GregorianCalendar.getInstance().getTime();


Converter String em Date:


String s = "21/08/1989"; //Dia em que Raul Seixas morreu :(
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
try {
Date d = format.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}


Converter Date em String:


Date d = GregorianCalendar.getInstance().getTime(); //ou qualquer data =D
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
String s = format.format(d);


Adicionar dias, meses e anos a uma data:


GregorianCalendar data = new GregorianCalendar(2007, 9, 20); //20/09/2007
data.add(GregorianCalendar.DAY_OF_MONTH, 1); // 21/09/2007
data.add(GregorianCalendar.MONTH, 2); // 21/11/2007
data.add(GregorianCalendar.YEAR, 1); // 21/11/2008


Observação: Para subtrair dias meses e anos, basta utilizar números negativos no segundo parâmetro:


GregorianCalendar data = new GregorianCalendar(2007, 9, 20); //20/09/2007
data.add(GregorianCalendar.DAY_OF_MONTH, -1); // 19/09/2007


Somar duas datas usando GregorianCalendar:


GregorianCalendar gc1 = new GregorianCalendar();
gc1.setTime(getData());
GregorianCalendar gc2 = new GregorianCalendar();
gc2.setTime(getHora());
gc1.add(Calendar.YEAR, gc2.get(Calendar.YEAR));
gc1.add(Calendar.MONTH, gc2.get(Calendar.MONTH));
gc1.add(Calendar.DAY, gc2.get(Calendar.DAY_OF_MONTH));
gc1.add(Calendar.HOUR, gc2.get(Calendar.HOUR_OF_DAY));
gc1.add(Calendar.MINUTE, gc2.get(Calendar.MINUTE));
gc1.add(Calendar.SECOND, gc2.get(Calendar.SECOND));


Recuperar parte da data (dia, mês, ano, etc):


GregorianCalendar gc = new GregorianCalendar(2007, 9, 20);
int dia = gc.get(GregorianCalendar.DAY_OF_MONTH)); // 20
int ano = gc.get(GregorianCalendar.YEAR)); // 2007
int era = gc.get(GregorianCalendar.ERA)); // 1 (1 = "depois de Cristo")


Impedir datas erradas:

Suponhamos que o animal do usuário consiga enviar uma data "20/99/2007"; O GregorianCalendar tem um artifício que previne que ocorra uma exceção. Nesse caso, ele entenderia mais ou menos como (2007 anos + 99 meses + 20 dias), o que resutaria, no nosso caso, em 20 de abril de 2015!

Pra evitar isso, existe uma função chamada setLenient(boolean b), que se for chamada com o parâmetro false, garante que a data não será aceita como válida (gerando uma exceção do tipo IllegalArgumentException, facilmente tratada). O único cuidado é que IllegalArgumentException é filhotinha de RuntimeException, ou seja, é uma exceção que só acontece quando o programa é executado.


Era isso. Qualquer coisa que eu lembrar eu acrescento depois. Qualquer dúvida, entrem em contato!

Té o/

2 comentários:

Guilherme disse...

Óiiinnnn fui procurar sobre o Gregorian Calendar e esse foi o primeiro resultado no google =~)

SEO cumendo....


=*

Unknown disse...

Aê leke! Tudo o que eu precisava (na verdade não), ajudou muito! \0/