[Discussão] Date ou Calendar?

Olá.

Sabemos que, em Java, podemos representar instantes do tempo através das classes Date e Calendar. Quando vocês estão modelando classes de negócio que possuem atributos do tipo data, quais dos dois tipos vocês costumam usar? Quais as vantagens e desvantagens de usar cada um deles?

Abraços

Se você quer só representar uma Data, pode utilizar o objeto Date.
Se quer manipular a data, então user Calendar(visto que os métodos de Date estão praticamente todos depreciados)

Ou tenha pena de sua sanidade e use o JodaTime para ambos os casos.

Eu só uso SimpleDateFormat!

Na SCJP eles cobram muito Date, DateFormat, Calendar, Locale… mas SimpleDateFormat é o “mais melhor de bom”!

Date está 99% deprecated… Gregorian Calendar não é perfeita, mas é menos pior… :roll:

Eu costumo declarar minhas variáveis como Date, e na hora de manipular, uso Calendar. Acontece que alguns métodos de Calendar retornam Date, fazendo com que guarde o resultado em um determinado tipo de variável: Date.

[]´s

[quote=leandronsp]Eu costumo declarar minhas variáveis como Date, e na hora de manipular, uso Calendar. Acontece que alguns métodos de Calendar retornam Date, fazendo com que guarde o resultado em um determinado tipo de variável: Date.

[]´s[/quote]
Atualmente, é o que eu faço também. Antes eu declarava tudo como Calendar, mas um objeto Date é bem mais leve - apesar de ter vários métodos depreciados.

"

galera como eu posso somar uma data com uma que ta armazenada no meu banco?
e por exemplo se quiser somar apenas o mês ou apenas o dia tem como?

[quote=colosos=colossus]galera como eu posso somar uma data com uma que ta armazenada no meu banco?
e por exemplo se quiser somar apenas o mês ou apenas o dia tem como?[/quote]

Use a classe Calendar para fazer isso, dependendo de como vc quer vc vai usar ou o método add, ou o método roll:

de uma olhada: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html

Com ambos Date e Calendar você acaba com um código mutável.

Teu código vai ficar um uns bugs bem difíceis de serem debugados quando você começar a reaproveitar os objetos(alguém vai ter essa idéia de jerico), ou distribuí-los em várias threads. A otimização do sistema vai pro espaço.

Sem duvida o joda-time é a API que voce sempre deve dar preferencia. Calendar é um pesadelo de se trabalhar!

joda-time? galera como trabalho com isso? e o meu problema já não sei mais o que fazer, tão falando que da bug.

[quote=tnaires][quote=leandronsp]Eu costumo declarar minhas variáveis como Date, e na hora de manipular, uso Calendar. Acontece que alguns métodos de Calendar retornam Date, fazendo com que guarde o resultado em um determinado tipo de variável: Date.

[]´s[/quote]
Atualmente, é o que eu faço também. Antes eu declarava tudo como Calendar, mas um objeto Date é bem mais leve - apesar de ter vários métodos depreciados.[/quote]

Esta discussão me escapou , por algum motivo…
Date é um Value Object para o long que representa o tempo decorrido de um determinado ponto do tempo representando um instante.
O problema com o Date é que ele - no inicio - transformava esse long em uma representação dia-mes-ano que não é i18n/l10n. Com a introdução de Calendar que é uma calculadora temporal a 18n foi introduzida e os métodos de date deprecated. O fato dos métodos de date estarem deprecated não é um problema! O método mais importante de date - e o único que é relevante para este VO - getTime() não está deprecated. A classe Date não está deprecated. Logo, ela deve ser usada como tiny type para tipagem forte de datas. Além disso Date deve ser considerado imutável pois são os seus métodos mutáveis que estão deprecated.

Calendar além de ser uma calculadora e não um VO (e portanto inerentemente mais pesado) é abstrato. O que significa que em runtime alguem pode ferrar seu codigo ou negocio passando a implementação errada. Básicamente ao usar calendar vc assume que será usado GregorianCalendar , mas isso não é garantido pela tipagem já que Calendar é abstract. Além disso se quiser fazer contas em diversos time frames ainda terá que utilizar um outro calendar (imagine-se usar o calendário tailandêz.para calcular juros…sei lá) Portanto no fim apenas será usado calendar.getTimeMilis que retorna o mesmo que date.getTime.

Como tipo sempre usar Date (ou melhor. Na realidade a pergunta é :porque raios vc não tem uma api própria para tratamento de datas ? Se não quer fazer uma , use uma que já existe.) como calculador sempre usar Calendar (ou melhor) , lembrando que calculos devem ser encapsulados em outros objetos/servicos (via interface) de forma que possa usar calendar ou outra implementação futura melhor (java 7 e sua data api , se vier, ou joda-time)

1 curtida

Sua explicação esclareceu muitas coisas mais como eu ainda estou em fase de treinamento com java não sei como somar uma data com a outra, queria um exemplo, eu vi que pode usar add ou roll.

[quote=colosos=colossus]Sua explicação esclareceu muitas coisas mais como eu ainda estou em fase de treinamento com java não sei como somar uma data com a outra, queria um exemplo, eu vi que pode usar add ou roll.
[/quote]

Você quer somar uma data com outra(datas não somam) ou uma data com uma duração?

Date data; // passado por parametro ou preenchido

Calendar c = Calendar.getInstance();
c.setTime(data);

c.add(Calendar.HOUR, 2); // data + duas horas

Date dataNova = c.getTime();

Com Joda Time:

DateTime data; // passado por parametro ou preenchido
DateTime dataNova = data.plusHours(2);

Não sei por que em java é tão difícil trabalhar com datas, é uma coisa horrível de ruim, chega a assustar! :shock:

Vou explicar melhor:
_ Bom eu estou trabalhando em um projeto que vai controlar os vales pedidos pelos funcionários, sendo que eu vou ter que informar a data de quando ele vai receber e umas data pré definida se ele for pagar com parcela os vales que ficou devendo. (a data de cada parcela)
uma parte do projeto diz assim:
O funcionário poderá negociar os vales que foram acumulados pelo mesmo, junto ao autorizado operador do sistema.
Sendo que o acordo pode ser feito com parcelamento dos vales acumulados para ser descontado no seu salário,
facilitando assim a maneira de tirar a dívida do empregado.

terei necessidade de ter uma data para somar a quinzena?
uma data para somar as parcelas?
sendo que de uma certa forma o usuário faria isso, mais não sei se é conveniente.

Eu sei pq. É que a maioria das pessoas não sabe que data é um assunto complexo. Que precisam estudar como funciona antes de começar a mexer.

quantos posts do guj se intitulam “como somar duas datas?” … a pergunta já começa mal. As pessoas não têm noção do que estão fazendo. ai, não ha api que aguente. As pessoas têm que conhecer os conceitos envolvidos e são muitos. desde o calculo em si, ao referencial (quem estudou referenciais em física? ) , unidades, caldendários, dependencias culturais, e até relações astronomica e geográficas. Tudo isso para entender uma simples data.

(o problema não é só com data, quando vamos para dinheiro o mesmo problema acontece. todo mundo ainda acha que pode modelar dinheiro com um maldito float).

é verdade tenho que dizer como acrescentar dias ou retirar(ou mês, ano)

Eu sei pq. É que a maioria das pessoas não sabe que data é um assunto complexo. Que precisam estudar como funciona antes de começar a mexer.

quantos posts do guj se intitulam “como somar duas datas?” … a pergunta já começa mal. As pessoas não têm noção do que estão fazendo. ai, não ha api que aguente. As pessoas têm que conhecer os conceitos envolvidos e são muitos. desde o calculo em si, ao referencial (quem estudou referenciais em física? ) , unidades, caldendários, dependencias culturais, e até relações astronomica e geográficas. Tudo isso para entender uma simples data.

(o problema não é só com data, quando vamos para dinheiro o mesmo problema acontece. todo mundo ainda acha que pode modelar dinheiro com um maldito float).[/quote]

ah tá, quando estiver num sistema de astronomia pode ser… rs
mas um simples cálculo de data, em java se torna um estudo científico, pra quê?