Aritmética de Campos de Tipo Data e Hora... é chato mesmo?

Ola,

Uso o Java ha algum tempo, e volta e meia me deparo com dificuldades na manipulacao de campos de Data e Hora, como somar 30 dias a uma data, pegar a diferenca em dias entre datas, calcular a idade de uma pessoa, etc. Eu fiz uma serie de metodozinhos em uma classe FormatDate e outros em uma FormatTime, para tentar resolver isso, e la dentro faco “altas manobras” com a SUPER-CHATA classe GregorianCalendar, haja vista que a “antiga” classe Date “nao tem mais moral”, esta depreacted.

Achei uma classe na Internet chamada Dato que tambem ajuda nas manobras. Mas gostaria de saber se trabalhar com datas e horas e tao chato assim mesmo ou se tem alguma “mutreta” que eu desconheco…

Quase toda essa manipulacao pode ser feita com a classe CALENDAR

A classe Calendar é pai da Classe GregorianCalendar, a qual
ja uso dentro da minha classe FormatDate para “tentar” manipular
datas de maneira mais facil. Contudo, toda a critica que fiz foi
sobre a GregorianCalendar, que é filha de Calendar, e portanto
tem ate “mais recursos”.

Contudo, minha principal critica é sobre a falta de uma classe
mais simples e transparente. As vezes temos que chamar varios
metodos com varios parametros para chegar ate onde queremos.

Se, por exemplo, houvesse um tipo primitivo para data, que
aceitasse aritmetica (+, -), difs, etc de forma transparente, toda
esta manipulacao seria muito mais limpa no codigo.

Poxa cara, eu uso essa classe e nunca tive problemas …

No seu exemplo para adicionar datas:

add(Calendar.DATE, 5)

Tá certo que não é tão facil quanto 1 + 1, mas eu acho muito mais claro …

Mas se você está realmente tendo dificuldades para usar os métodos da classe Calendar, aconselho a procurar por exemplos na internet.
No google
http://www.google.com.br/search?sourceid=navclient&hl=pt-BR&ie=UTF-8&oe=UTF-8&q=java+calendar
Há varios sites com applets de calendario com o source code disponivel.

Eu uso a Classe GregorianCalendar ha bastante tempo tambem.
Mas a minha critica esta no fato de nao ter um tipo primitivo, que
seria muito util na maioria dos casos. Afinal, quando trabalhamos
com Data e aritmetica, normalmente queremos fazer coisas muito
simples, como 1+1 mesmo…

É edilmar, enquanto não colocarem sobrecarga de operador em java, o jeito é usar o GregorianCalendar mesmo…

Mas ela não é tão complicada assim não. É bem fácil de usar… só é chato!

:slight_smile:

Falou tudo!!! É chato mesmo!

Jah vi outras linguagens e nao achei nenhuma com um tratamento de datas mais claro e simples que a do Java … Tem tudo q vc quer… Conhecendo bem a API, acredito q nao tem o q vc nao consiga fazer.

Olha, eu nem duvido desta afirmação, mas até agora eu não consegui obter a idade do usuário em anos, meses e dias usando apenas a classe Calendar e a classe Date…

Alguma luz com isso???

Para certos calculos de datas, eu desisti da classe Calendar,
e parti para uma classe chamada Dato, feita por um alemao.
É muito mais simples e clara do que o rolo da Calendar.

E onde vc pegou essa classe???

Acho que o problema aqui é que na verdade o Java guarda a data em milisegundos. Nada te impede de trabalhar com um long como sua data. Só que aí é chato pra caramba.

No Oracle é uma maravilha, pois quando vc subtrai uma data de outra ele te dá o valor em dias, com decimais para as horas/segundos/etc

Então se vc quiser saber quantos dias existem entre uma data e outra vc faz

select d1 - d2 from …

ou melhor

select trunc(d1 - d2) from…

(o trunc elimina a parte decimal te deixando só a parte inteira)

se quiser somar um dia na sua data vc faz

d1 = d1 + 1;

as simple as that…

acho que se alguém criar uma classe que armazena a data em dias, talvez a coisa fique mais fácil…

na maioria das vezes, são os dias que vc quer, ninguem faz relatórios usando períodos em milisegundos, mas sim dias ou no máximo horas… mas cada caso é um caso…

então se eu tenho um double (ou float) D1 e outro D2 e eu quero saber quantos dias existe entre essas datas eu faço:

System.out.println((int) (d1 - d2));

O cast é para se livrar da parte decimal…

Eu tb acho chato trabalhar com o Calendar do Java… outros acham tranquilíssimo… isso é gosto…

Acho que aqui faz bastante falta um overload de operador, para poder fazer aritmética com objetos… fica mais limpo no código…

O que é melhor:

System.out.println(d1 + 10);

ou

System.out.println(cal.add(Calendar.DAY_OF_MONTH, 10));

Concordo plenamente.
O mais correto seria uma sobrecarga de operador para datas.
Seria o paraiso das datas!

Quanto a classe Dato, esta em:
http://www.geocities.com/CollegePark/Quad/5317/java/
e o JavaDoc é:
http://www.geocities.com/CollegePark/Quad/5317/java/Dato.html