Subtrair datas com recursos nativos do java  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
humberto-adm
Debugger
[Avatar]

Membro desde: 13/05/2009 11:24:52
Mensagens: 56
Offline

Olá galera,

Estou com um projeto desenvolvido em java quase pronto, mas preciso realizar uma subtração envolvendo duas datas.
Na tela do sistema tenho dois campos de texto com uma máscara do tipo ##/##/####. Gostaria de realizar a subtração destas datas para obter o intervalo em dias.

E aproveitando a mensagem, gostaria de sabre as classes do API que trabalham com data. Já conheço Date e Calendar.

[]s, Obrigado

O mundo se torna mais inteligente no compartilhamento da informação.
Humberto, humberto-adm@hotmail.com
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline

São só essas duas. E são péssimas. Não é à toa que muita gente prefere usar a JODA-Time:
http://joda-time.sourceforge.net/

Eu recomendo fortemente que você use.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

humberto-adm wrote:Olá galera,

Estou com um projeto desenvolvido em java quase pronto, mas preciso realizar uma subtração envolvendo duas datas.
Na tela do sistema tenho dois campos de texto com uma máscara do tipo ##/##/####. Gostaria de realizar a subtração destas datas para obter o intervalo em dias.

E aproveitando a mensagem, gostaria de sabre as classes do API que trabalham com data. Já conheço Date e Calendar.


Só existem essas duas.... mas java é uma linguagem de programação (pun intended).
Isso significa que vc pode criar as suas proprias classes para manipular datas e tempos. Isto não significa que é fácil...

Substrair duas datas não é um processo matemático no sentido que vc não pode simplesmente subtrair cada campo da data.
É por isso que deve usar Calendar para fazer calculos. (estamos num cenário onde apenas pode usar classes padrão)

Você tem que tender como fazer esses calculos e para isso vc precisa entender os conceitos relacionados à medição do tempo em java. Neste link vc encontra uma implementação de um método que calcula o numero de dias entre duas datas.

This message was edited 1 time. Last update was at 26/05/2010 10:01:37


Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
humberto-adm
Debugger
[Avatar]

Membro desde: 13/05/2009 11:24:52
Mensagens: 56
Offline

Bom eu estou tentando implementar um classe para realizar esta operação mas esta consumindo tempo no projeto.
ViniGodoy você poderia me passar como eu poderia subtrair duas datas do tipo 2010/05/26 e 2010/05/30 utilizando o JODA - Time.
Eu ja tenho um método que remove as barras da data e se precisar fazer isto eu utilizo ele para elas ficarem assim: 20100526 e 20100530.

Se puder me ajudar eu agradeço muito pq tenho que entregar este projeto semana que vem na faculdade.

[]s, Obrigado

O mundo se torna mais inteligente no compartilhamento da informação.
Humberto, humberto-adm@hotmail.com
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline

Tem um exemplo logo na página inicial do JodaTime:



@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
marlon.carvalho
HelloWorld

Membro desde: 13/06/2009 17:23:51
Mensagens: 14
Offline

humberto, é possível fazer. Existe este cálculo na biblioteca Alfred (http://alfredlibrary.org), no utilitário CalculoData. Se a ideia é verificar quantos dias existem entre duas datas, então você pode usar a biblioteca desta forma:



Mas, se não quer anexar a biblioteca ao seu projeto, você pode verificar como foi implementado aqui:
http://www.alfredlibrary.org/maven/xref/index.html

Basta achar a classe que mencionei.
sf.marcius
JavaGuru
[Avatar]

Membro desde: 11/01/2007 05:58:55
Mensagens: 200
Offline

usa 2 Dates.



depois converte pra dias:

1 dia = 24 hs
1h = 60 mins
1min = 60 segs
1 seg = 1000 msegs

logo



vc pode criar uma classe DateHelper por ex e colocar nela os metodos utilitários para datas que tu criar.
eu pelo menos fiz isso.

[]s

"Software engineering is a race between programmers, striving to build bigger & better idiot-proof programs, and the Universe, striving to build bigger and better idiots. So far, the Universe is winning."
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

sf.marcius wrote:usa 2 Dates.



depois converte pra dias:

1 dia = 24 hs
1h = 60 mins
1min = 60 segs
1 seg = 1000 msegs

logo



vc pode criar uma classe DateHelper por ex e colocar nela os metodos utilitários para datas que tu criar.
eu pelo menos fiz isso.


Errrr... Isto é exatamente como vc não deve fazer!


@humberto-adm , cara pelo menos leia as referencias que damos. Se vc tivesse lido o link que passei vc encontrava este método


Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
sf.marcius
JavaGuru
[Avatar]

Membro desde: 11/01/2007 05:58:55
Mensagens: 200
Offline

sergiotaborda wrote:
Errrr... Isto é exatamente como vc não deve fazer!


que existem melhores meios de se fazer isso, como usando o Joda Time por exemplo, isso eu sei...

mas pq aquilo que fiz é o modo como não se deve fazer?

veja bem que o colega ta dizendo que as datas vêm de text fields com máscara "##/##/####", logo o parse dos dates não conterão infos de hora. também colocou no título "recursos nativos", por isso nao disse de cara o "Joda".

usando um mesmo SimpleDateFormat pra fazer o parse dos dois campos, não fará diferença a localização (ambos terão a mesma).

o caso do colega é simples.
o algorítmo que postei é simples e fácil de entender.

qual o caso que ele não da certo nessas condições?

Obs: estou perguntando na humildade

[]s

This message was edited 2 times. Last update was at 26/05/2010 18:43:48


"Software engineering is a race between programmers, striving to build bigger & better idiot-proof programs, and the Universe, striving to build bigger and better idiots. So far, the Universe is winning."
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

sf.marcius wrote:
sergiotaborda wrote:
Errrr... Isto é exatamente como vc não deve fazer!


que existem melhores meios de se fazer isso, como usando o Joda Time por exemplo, isso eu sei...

mas pq aquilo que fiz é o modo como não se deve fazer?



Porque o tempo contado em milisegundos não é proporcional ao tempo corrido em dias. Por exemplo, se o ano é bissexto o tempo em milesgundos corrido desde 27 de fevereiro a 1 de março é o mesmo que corrido de 28 a 1 se o ano não é bissexto. Existem muitas peculiaridades e por isso que temos a classe calendar para cuidar disso. Depois a conversão para dias e meses é simplista, dependendo do ano e do calendário , ela pode não estar certa. Portanto, é melhor usar o algoritmo que funciona sempre, e esse é aqule que exemplifiquei, vai somando um dia, até chegar na data que se quer. Repare que não é uma questão de melhor e pior. O seu método não dá resultados corretos, logo ele nem sequer uma opção.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
humberto-adm
Debugger
[Avatar]

Membro desde: 13/05/2009 11:24:52
Mensagens: 56
Offline

A solução que eu usei no meu projeto foi essa, deu certo, eu tinha pensado neste tipo de método, obrigado
[]s

sf.marcius wrote:usa 2 Dates.



depois converte pra dias:

1 dia = 24 hs
1h = 60 mins
1min = 60 segs
1 seg = 1000 msegs

logo



vc pode criar uma classe DateHelper por ex e colocar nela os metodos utilitários para datas que tu criar.
eu pelo menos fiz isso.

[]s

O mundo se torna mais inteligente no compartilhamento da informação.
Humberto, humberto-adm@hotmail.com
[MSN]
humberto-adm
Debugger
[Avatar]

Membro desde: 13/05/2009 11:24:52
Mensagens: 56
Offline

Vou procurar usar a biblioteca JODA, parece ser fácil.
E qualquer dúvida eu posta aqui no fórum...
Vlw pela dica pessoal
[]s

O mundo se torna mais inteligente no compartilhamento da informação.
Humberto, humberto-adm@hotmail.com
[MSN]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team