Jump to content
rexxar

DUVIDA: contar os dias entre duas datas !!

Recommended Posts

rexxar

boas pessoal.. o meu objectivo é dadas 2 datas conseguir saber quantos dias passaram entre elas..

ou seja por exemplo quantos dias tenho de vida.. etc..

tenho andado as voltas com o algoritmo e acabo sempre com um monte de erros..

isto é o que tenho agora:


// quantidade de anos
if(mes1<mes2) ano=(ano1-ano2)-1;
else ano=ano1-ano2;		//mes 2 menor
        if (ano<=0)ano=0;

//quantidade de meses
if(ano1>ano2)mes=12-mes2+mes1;
else mes=mes2;
mes=mes+12*ano;

//quantidade de dias
if (mes1<mes2)
meses=(12-mes1)+(12-mes2)+mes;
else meses=mes1-mes2+mes;
dia=30*meses+5*ano; // fevereiro com 28 dias e 7 meses com 31dias

Share this post


Link to post
Share on other sites
Localhost

Tens de calcular os dias todos que esse ano tem, desde o inicial até ao final do ano (tens de verificar quantos dias tem cada mês, anos bissextos, etc.) e depois fazer o mesmo para o resto dos anos.


here since 2009

Share this post


Link to post
Share on other sites
mjamado

Isso é algum trabalho da escola? É que já é o segundo em poucos dias...

No outro tópico deixei a solução toda em C, mas levei logo na tarraqueta. Por um lado, ainda bem que apaguei a solução, porque até tinha erros; e consegui chegar a um algoritmo bastante melhor.

Não tentes calcular logo o número de dias entre duas datas - calcula o número de dias desde o ano 0 para cada uma, e depois subtrais uma pela outra.

Tem cuidado - muito cuidado - com os anos bissextos. A primeira pista que te dou é que o dia da bissextalidade (29 de Fevereiro) é num dia mesmo, mesmo, chato. Se fosse no fim do ano era muito mais fácil fazer as contas...  :cheesygrin:


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
rexxar

lol.. bem umas respostas que mais parecem a "casa ao tesouro" ;D lol..

mas bem ja e uma ajuda.. vou bater mais uma beca no pc.. pode ser que saia alguma coisa!! lol

mas digo ja que estou com problemas e para calcular o numero de dias do mes.. como faco se para saber quantos dias passaram ate maio ou ate novembro..etc..

obrigado

Share this post


Link to post
Share on other sites
Strabush

Acho que por coincidência, também tenho um work assim pra faculdade, a ser entregue mto brevemente.

Quanto a calcular os dias do mês no mesmo ano é relativamente fácil. Usas o ciclo "for".

Ex:

for (i=mes1+1; i<=mes2-1; i++){
                    dm += mes[i]; }
     dm1 = mes[mes1] - dia1;
     dias = dm + dm1;
     return dias;

Atenção: Utiliza isso caso tenhas declarado um vector de 13 elementos cujas posições correspondem ao número de dias do mês.

Share this post


Link to post
Share on other sites
mjamado
lol.. bem umas respostas que mais parecem a "casa ao tesouro" ;D lol..

Claro, noutro tópico semelhante meti a minha implementação completa, veio logo o moderador aqui da zona dar-me na cabeça. A partir de agora, é assim: sei muito, mas não posso dizer; temos pena.

Há várias maneiras do gato ir às filhoses, certo? Mas pensem assim: ciclos são inimigos da performance. O ideal é conseguir fazer o problema todo sem ciclos.

E vejam bem esta pista que já dei ali atrás: o dia da bissextalidade (29 de Fevereiro) é num dia mesmo, mesmo, chato. Se fosse no fim do ano era muito mais fácil fazer as contas...


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
Localhost

Gimme a break. Agora não vais transformar todas as dúvidas em enigmas, pois não?

Podes ajudar, sem dar a solução.


here since 2009

Share this post


Link to post
Share on other sites
mjamado

Gimme a break. Agora não vais transformar todas as dúvidas em enigmas, pois não?

Podes ajudar, sem dar a solução.

Quase impossível, a solução tem três linhas. Mas be my guest.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
rexxar

pessoal  nada de zangas..

com ou sem mapa do tesouro ja consegui acabar..

esta uma linguagem esparguete mas serve ;D

a dica de relacionar com ano 0 foi mt boa..

a outra do ano bisexto nao percebi!!!!

o ciclo tb me parece bem.. mas eu fiz assim:

conta_dias_mes(int *dia,int *mes,int *ano)
{
    int a=0,dias=0;
    if((*ano%4==0)&&(*ano%100!=0) || (*ano%400==0))a=29; // ano bissexto e fev tem 29 dias
    else a=28;
    switch(*mes)
{
	case 12: dias=30;
	case 11: dias=dias+31;
	case 10: dias=dias+30;
	case 9: dias=dias+31;
	case 8: dias=dias+31;
	case 7: dias=dias+30;
	case 6: dias=dias+31;
	case 5: dias=dias+30;
	case 4: dias=dias+31;
	case 3: dias=dias+a;
	case 2: dias=dias+31;
	case 1: dias=dias;
}
return dias;
}

assim conto os dias desde o inicio do ano até ao mes..

depois e so somar o dia e somar os dias dos anos passados..

brigadao..

Share this post


Link to post
Share on other sites
mjamado
a dica de relacionar com ano 0 foi mt boa..

a outra do ano bisexto nao percebi!!!!

Lá está, rexxar, para calculares a partir do ano 0, tens de saber quantos anos bissextos apanhas pelo caminho. As duas coisas estão relacionadas. Mas lá está, se a performance não está em causa, é só iterar pelos anos todos a testar a bissextalidade e ir somando os que se encontrarem. É assim que estás a fazer, não é?


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
Localhost

pessoal  nada de zangas..

com ou sem mapa do tesouro ja consegui acabar..

esta uma linguagem esparguete mas serve ;D

a dica de relacionar com ano 0 foi mt boa..

a outra do ano bisexto nao percebi!!!!

o ciclo tb me parece bem.. mas eu fiz assim:

conta_dias_mes(int *dia,int *mes,int *ano)
{
    int a=0,dias=0;
    if((*ano%4==0)&&(*ano%100!=0) || (*ano%400==0))a=29; // ano bissexto e fev tem 29 dias
    else a=28;
    switch(*mes)
{
	case 12: dias=30;
	case 11: dias=dias+31;
	case 10: dias=dias+30;
	case 9: dias=dias+31;
	case 8: dias=dias+31;
	case 7: dias=dias+30;
	case 6: dias=dias+31;
	case 5: dias=dias+30;
	case 4: dias=dias+31;
	case 3: dias=dias+a;
	case 2: dias=dias+31;
	case 1: dias=dias;
}
return dias;
}

assim conto os dias do mes..

brigadao..

Não confundas uma coisa com a outra. Ninguém se zangou, as coisas são mesmo assim  :P


here since 2009

Share this post


Link to post
Share on other sites
rexxar

tipo em cada 5 anos que passam 1 deles e bisexto, entao dividi a quantidade de anos por 5.. e somei aos dias totais.

assim :

dias_ano=(365*ano)+ano/5;

pareceu m que o raciocinio esta correto

Share this post


Link to post
Share on other sites
mjamado

tipo em cada 5 anos que passam 1 deles e bisexto, entao dividi a quantidade de anos por 5.. e somei aos dias totais.

assim :

dias_ano=(365*ano)+ano/5;

pareceu m que o raciocinio esta correto

Quase...

Em primeiro lugar, não são cinco, são só quatro (atão, pá?).

Depois, essa regra é mais ou menos comum, mas não está completa. A cada 100 anos há um que era suposto ser bissexto, mas na realidade não é. Para além disso, a cada 400, há um que é suposto não ser pela regra anterior, mas é mesmo.

Então,

dias_ano = (365 * ano) + ano / 4 - ano / 100 + ano / 400;

Mas se fizeres alguns testes com uma aplicação que calcule distâncias entre datas, vais chegar à conclusão que ainda não está mesmo na batata, ainda vais falhar por um ou dois dias nalguns testes. O problema aqui é quando a data que estás a contabilizar é num ano bissexto, dependendo se é antes ou depois do dia 29 de Fevereiro - e se a data for o próprio dia 29, então estás mesmo enterrado.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
rexxar
não são cinco, são só quatro

tipo podem passar 4 anos e nenhum deles ser bisexto..

por isso e que utilizei o 5..

quanto ao 100 e ao 400 nao sabia que eram excepçoes..

ate agora o programa esta a correr bem.. o problema do dia 29 resolvi com o switch que ja apresentei a bocadito..

Share this post


Link to post
Share on other sites
mjamado

tipo podem passar 4 anos e nenhum deles ser bisexto..

por isso e que utilizei o 5..

quanto ao 100 e ao 400 nao sabia que eram excepçoes..

ate agora o programa esta a correr bem.. o problema do dia 29 resolvi com o switch que ja apresentei a bocadito..

Se passares por quatro "Fevereiros", há um, de certeza absoluta, que tem dia 29...  :) A menos que seja um ano "100" e não seja um ano "400".

Mas testa isso intensivamente. Se tiveres o Windows 7, a calculadora nova tem funções de datas.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
rexxar

ok ja percebi!! nepia nao tenho o windows 7.. tenho linux - ubuntu!!

ja acabei nao mexi mais..

ja estou a fazer o relatorio!!

obrigado

Share this post


Link to post
Share on other sites
citadp

Boas pessoal. Tenho um programa para fazer parecido a este, após horas ontem a fio só consegui fazer este programa que calculava um mês, mas n era nada disto.

O que queria era após inserir data de nascimento exemplo 15 10 2011 e mes e ano a analisar  por exemplo12 2011, daria os dias que passaram até ao 1º dia do mês de dezembro. que daria 46 dias, porque contamos desde dia 15 até 1 de novembro.

#include <stdio.h>

int main (void){

int ano;
int mes;
int dia;

printf ("Introduza o dia, mes e ano, separados por espaços:\n");
scanf ("%d%d%d", &dia, &mes, &ano);

if (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12)
  printf ("%d dias \n", 32-dia);
   else
     if (mes !=2)
     printf ("%d dias\n", 31-dia);
      else
       if (ano %4 == 0)
        printf("%d dias\n",30-dia);
        else
        printf("%d dias\n", 29-dia);

return 0;
} 

Após pesquisar neste forum tentei juntar o que vi aqui...

#include <stdio.h>

int conta_dias_mes(int dia,int mes,int ano);

int main (void){

int ano;
int mes;
int dia;
int mesAnalisar;
int anoAnalisar;

printf ("Introduza o dia, mes e ano, separados por espaços e a data a analisar:\n");
scanf ("%d%d%d", &dia, &mes, &ano, &mesAnalisar, &anoAnalisar);
printf (" %d dias", conta_dias_mes(dia,mes,ano));

return 0;
} 

conta_dias_mes(int dia,int mes,int ano)
{
    int a=0,dias=0;
    if((ano%4==0)&&(ano%100!=0) || (ano%400==0))a=29; 
    else a=28;
    switch(mes)
        {
                case 12: dias=30;
                case 11: dias=dias+31;
                case 10: dias=dias+30;
                case 9: dias=dias+31;
                case 8: dias=dias+31;
                case 7: dias=dias+30;
                case 6: dias=dias+31;
                case 5: dias=dias+30;
                case 4: dias=dias+31;
                case 3: dias=dias+a;
                case 2: dias=dias+31;
                case 1: dias=dias;
        }
        return dias;

mas aqui conta os dias desde o inicio do ano...

alguem me pode ajudar ?

Share this post


Link to post
Share on other sites
Flinger

Para quem tiver estes problemas em exercício de universidade, é valorizado o algorítmo, logo tentem fazer de acordo com o que outros já falaram por aqui.

Se alguém precisar de uma solução que não obrigue a implementar o algoritmo, existem bibliotecas em Linux que vos podem ajudar muito.

Primeiro existe um tipo de dados time_t, que vos indica o número de segundos que passaram desde 1 de Janeiro de 1970.

Segundo existe uma estrutura: struct tm, que representa uma data com todos os campos (dia, ano, mes, hora minuto, segundos, e mais alguns). Existem funções que fazem a conversão de um para o outro e vocês podem fazer operações algébricas com eles.

Algumas funções úteis:

http://www.manpagez.com/man/3/difftime/

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.