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?
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.
F
Felipe_Kan
Eu só uso SimpleDateFormat!
Na SCJP eles cobram muito Date, DateFormat, Calendar, Locale… mas SimpleDateFormat é o “mais melhor de bom”!
P
pcassiano
Date está 99% deprecated… Gregorian Calendar não é perfeita, mas é menos pior… :roll:
L
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
T
tnaires
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
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.
M
marcosalex
"
C
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?
J
jc_neto
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?
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:
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.
P
Paulo_Silveira
Sem duvida o joda-time é a API que voce sempre deve dar preferencia. Calendar é um pesadelo de se trabalhar!
C
colosos_colossus
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.
S
sergiotaborda1 like
tnaires:
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
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.
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)
C
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.
B
Bruno_Laturner
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.
Você quer somar uma data com outra(datas não somam) ou uma data com uma duração?
Datedata; // passado por parametro ou preenchidoCalendarc=Calendar.getInstance();c.setTime(data);c.add(Calendar.HOUR,2); // data + duas horasDatedataNova=c.getTime();
Com Joda Time:
DateTime data; // passado por parametro ou preenchido
DateTime dataNova = data.plusHours(2);
A
alindre
Não sei por que em java é tão difícil trabalhar com datas, é uma coisa horrível de ruim, chega a assustar! :shock:
C
colosos_colossus
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.
S
sergiotaborda
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).
C
colosos_colossus
é verdade tenho que dizer como acrescentar dias ou retirar(ou mês, ano)
A
alindre
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).
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ê?
D
danielfigueiredoc
alindre:
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ê?
Realmente não tem necessidade, só pra quem relamente tem interesse ( não que eu não me interesse ) mais é radical dizer que você precisar estudar física e várias locuras pra entender como funciona data em java.
Tem gente que nem faculdade faz, nem sabe calcular peso em física e meche com date e calendar mto bem xD
B
Bruno_Laturner
Facil né? Responde esta então, em pseudocódigo p/ ficar mais fácil:
Data data = 17 de outubro de 2009, às 12:00:00 (meio-dia), Fuso Horário de São Paulo.
Data dataMais24Horas = data + 24 horas.
Qual é a data e hora por extenso de dataMais24Horas?
A
alindre
18 de outubro de 2009, às 12:00:00 (meio-dia)
isso que to dizendo, deveria ser simples como realmente é.
S
sergiotaborda
danielfigueiredoc:
alindre:
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ê?
Realmente não tem necessidade, só pra quem relamente tem interesse ( não que eu não me interesse ) mais é radical dizer que você precisar estudar física e várias locuras pra entender como funciona data em java.
Não é preciso para entender datas em java. É preciso para entender datas.
Depois que vc entender datas, ai sim vc pode tentar entender datas em java.
Tem gente que nem faculdade faz, nem sabe calcular peso em física e meche com date e calendar mto bem xD
Será mesmo ? Vc sabe que tem pessoas fazendo isto:
isso que to dizendo, deveria ser simples como realmente é.
Bem, a parte complicada não é a pergunta nem a resposta, é saber se você considera a resposta certa, dependendo de um contexto:
Dia 18 de outubro de 2009 às 00:00:00 começa o horário de verão no Brasil.
Se eu te desse um trabalho para entregar até meio dia do dia 18, você teria 23 horas para realizá-lo.
Se eu te desse um trabalho para entregar em 24 horas, é capaz de eu querer o trabalho para meio dia, e você entregar até 13:00, e ambos estariam certos, cada um com a sua lógica.
Se nós tivéssemos fora do Brasil, ou lá em Manaus, não teria conversa, seria meio-dia mesmo.
A
alindre
Bruno Laturner:
alindre:
18 de outubro de 2009, às 12:00:00 (meio-dia)
isso que to dizendo, deveria ser simples como realmente é.
Bem, a parte complicada não é a pergunta nem a resposta, é saber se você considera a resposta certa, dependendo de um contexto:
Dia 18 de outubro de 2009 às 00:00:00 começa o horário de verão no Brasil.
Se eu te desse um trabalho para entregar até meio dia do dia 18, você teria 23 horas para realizá-lo.
Se eu te desse um trabalho para entregar em 24 horas, é capaz de eu querer o trabalho para meio dia, e você entregar até 13:00, e ambos estariam certos, cada um com a sua lógica.
Se nós tivéssemos fora do Brasil, ou lá em Manaus, não teria conversa, seria meio-dia mesmo.
]
agora entendi.
e tô pra dizer que tem muuuuitos sistemas por aí que nem levam em conta o horário de verão.
S
sergiotaborda
marcosalex:
Por que será que o Delphi consegue, o .NET consegue e a API Joda Time do Java conseguem mas a Sun não consegue?
Se eu precisar de entender tanto simplesmente pra somar uma data, alguma coisa está errada. É a mesma coisa do Java antigamente quando eu queria fazer um simples crud. Felizmente a Sun está abrindo a cabeça, antes tarde do que nunca
A Joda Time consegue porque eles fizeram o trabalho de casa. Eles estudaram o dominio em causa para saber as regras certas.
Estudaram a ISO para saber os padrões certos. E não tiveram pena do programador criando um bando de interfaces e implementações.
A Sun não estudou direito. Cometeram alguns erros exactamente porque não estudaram direito. Além disso quiseram colocar apenas uma classe. (Em java embarcado Calendar é bom demais porque uma API completa poderia ser overkill).
A API atual não ruim. Ela funciona. Embora com alguns bugs eventuais (que afetam menos de 1% dos programadores) e um design simplista. A Joda API e a nova API de datas tem objetivos maiores. Querem deixar os calculos mais fluidos (fluentes), com correção
de problemas de design da api original.
Mas lembre-se que - e isto sempre tem muita gente que esquece - a API java , ao contrário da .NET não é uma API de plataforma de aplicação. Portanto, ela não tem nenhuma responsabilidade em modelar dominios corretamente ou em coerencia com o uso que as aplicações farão. Ela tem responsabilidade de mediar com o OS (System.currentMilis() ) . O Java ainda lança a i18n como sua responsabilidade e é isso que não foi bem modelado. Porquê ? Porque é realmente complexo. Quem dá calendar.add() não dá valor ao que acontece por trás…
V
vitu
No java 7 manipular as datas vai ficar mais decente.
P
Paulo_Silveira
Ja fiz cada erro grotesco similares as perguntas do Bruno e do Sergio… e a api de Calendar nao ajuda a evita-los: os nomes dos metodos sao confusos, a soma de Date que o Sergio colocou é muito facil de se deixar levar. A joda-time ja deixa as coisas mais claras, e voce acaba tomando mais cuidado, ate pela nomenclatura de metodos, classes e interfaces!
P
Paulo_Silveira
sergiotaborda:
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.