Dias entre intervalo de várias datas que podem ter intersecção entre elas [RESOLVIDO]

Boa tarde,

Preciso obter o intervalo de dias entre vários períodos de datas, acontece que as datas podem perterncer a períodos diferentes. Ex.:

03/03/2009 a 30/03/2009 - 27 dias

05/03/2009 a 15/03/2009 - 10 dias

.
.
.

Acontece que ai houve uma intersecção entre duas datas, os dias 05 ao dia 15 pertenceram as duas datas e apenas um deve contar… então teria apenas 27 dias!

Alguma dica de fazer isso, já tentei com alguns whiles, mas não deu muito certo,

Qualquer dica/ajuda é bem vinda.
Obrigado

Acho que vc poderia fazer isso usando Joda Time Interval.

Já tem métodos prontos pra ver sobreposição, gaps e etc. o problema seria só a lógica. :lol:

Pelo que eu entendi, é fácil.

Primeiro leia todas as datas que você quer e ordene.

Calcule apenas a diferença entre a maior data e a menor, todas as intermediárias são descartadas.

[quote=pablosaraiva]Pelo que eu entendi, é fácil.

Primeiro leia todas as datas que você quer e ordene.

Calcule apenas a diferença entre a maior data e a menor, todas as intermediárias são descartadas.[/quote]

pensei nisso inicialmente, mas não pode ser só isso, pq podem ter gaps entre a menor data e a maior data.

imagina a situação

01/jan-10/fev
01-mar-01-abr

tem um intervalo entre 10 fev e 01-mar, esse valor deverá ser descontado. ele pode é somar tudo e depois descontar os gaps.

blz pessoal, obriago mesmo pelas sugestões :slight_smile:

Depois de quebrar a cabeça e como preciso disso urgente fiz assim: Leio a data e armazeno num vetor de datas, leio a segunda e armazeno… se a data lida já conter no vetor eu não a adiciono. No fim eu sei quantas datas diferentes existem. Seri que não é das melhores formas, mas me serviu e é só pra um amigo utilizar nuns cálculos ai de uma escola.

Agora o que tá pegando é transformar 500 dias por exemplo em ano, mes, e dias, sei que tenho que dividir td por 365 pra pegar o ano, e o resto por 30 pra pegar o mês, mas tá dando uns erros aqui. Alguém já fez isso?

obrigado

[quote=luceliopv]blz pessoal, obriago mesmo pelas sugestões :slight_smile:

Depois de quebrar a cabeça e como preciso disso urgente fiz assim: Leio a data e armazeno num vetor de datas, leio a segunda e armazeno… se a data lida já conter no vetor eu não a adiciono. No fim eu sei quantas datas diferentes existem. Seri que não é das melhores formas, mas me serviu e é só pra um amigo utilizar nuns cálculos ai de uma escola.
[/quote]

Se vc não quer a melhor forma não sei porque pergunta.
Primeiro o seu problema não está bem explicado. Para as datas

03/03/2009 a 30/03/2009 e 05/03/2009 a 15/03/2009 temos dois intervalos
se unirmos essses intervalos vamos obter 03/03/2009 a 30/03/2009 já que o segundo está contido no primeiro.
O resultado seria 27 dias. Se vc quer contar os dias dos dois intervalos basta apenas somar os dias de cada um sendo irrelevante que os intervalos possam se sobrepor.

Antes de resolver o problema, é preciso saber qual é o problema.

Esse divisão depende do ano. Nem sempre o ano tem 365 dias.
Se quiser fixar ano = 365 , mes = 30 então use o operador resto (%) e operação de divisão inteira (/)

Você poderia ser mais educado!, não pedi sua ajuda, você ajuda se quer…

Quanto ao problema, esclareci que as datas não podem se repetir, se duas forem iguais apenas uma contará.

O ano eu fixei em 365 dias e o mês em 30 dias e resolvi o problema

Obrigado

[quote=luceliopv]Você poderia ser mais educado!, não pedi sua ajuda, você ajuda se quer…
[/quote]

Vc tb, e além disso vc precisa ser mais profissional. Se veio perguntar no guj é porque precisa de ajuda.
Mas se vc quer a solução gambiarra veio perguntar no lugar errado. As pessoas estão tentando lhe dar a solução melhor e vc despreza esse esforço dizendo:

Isso é que é ser mal educado. Desconsiderar totalmente o que lhe foi dito e pior que isso, a qualidade da solução.
Quer fazer gambiarra, invente a sua. Não venha gastar o tempo das pessoas que vão lhe responder coisas corretas.

Vc não entende nada mesmo, em nenhum momento desprezei a ajuda dos colegas, agradeci a ajuda deles e falei que por precisar disso hoje não poderia me aprofundar nas soluções propostas e faria algo rápido mas que funcionasse. Se tivessem uma ideia que não me fizesse perder muito tempo ou algo que já tivessem feito eu usaria.

E ao contrário de vc, nenhum se manifestou de forma desrespeitosa e arrogante, foram bem gentis.

E novamente, o fórum é um lugar aberto e vc não tem obrigação nenhuma de me ajudar, ainda mais da forma que fez. Se é para tratar as pessoas assim, se omita de comentar, finja que nem leu o tópico, outras pessoas pacientes e educadas ajudarão.

Obrigado

[quote=luceliopv]Vc não entende nada mesmo, em nenhum momento desprezei a ajuda dos colegas, agradeci a ajuda deles e falei que por precisar disso hoje não poderia me aprofundar nas soluções propostas e faria algo rápido mas que funcionasse. Se tivessem uma ideia que não me fizesse perder muito tempo ou algo que já tivessem feito eu usaria.

E ao contrário de vc, nenhum se manifestou de forma desrespeitosa e arrogante, foram bem gentis.
[/quote]

A diferença é apenas essa. Elas não se manifestaram eu sim. O que vc fez sim foi errado. Vc tentou se aproveitar do guj sem respeito pelas pessoas ou pela produção de software. Vc mesmo confessou que se tivessemos algo pronto que não fizesse pensar vc usaria.

Se as pessoas soubessem disso no inicio nem sequer teriam respondido, da mesma forma que não se responde a pedidos de resolução de trabalho de casa.

É vc que está em violação da etiqueta do guj, eu estou apenas lhe chamando a atenção para que não se repita das próximas vezes e principalmente para que outros não tentem o mesmo.

Não vou continuar discutindo, já agradeci aos que se manifestaram de forma educada e me sugeriram soluções. Obrigado a vocês.