segundos a partir de 1970 para data?

lealoureiro13

Power Member
Alguém me pode ajudar a fazer um algoritmo em C que converta um numero inteiro em segundos a partir de 1970 para um data com a seguinte estrutura:


{
int seg;
int mm;
int hh;
int dd;
int mm;
int ano;

}

Cumps...
 
Quando se estuda um algoritmo convém garantir que o mesmo não tem falhas, como tal, testa-se bastantes vezes a ver se falha em alguma situação ;)

Mas nada que uma pesquisa não confirme tudo ;)
 
Para reforçar o que foi dito pelo Heckel acerca dos anos bissextos apresento aqui uma citação do livro Programação em C++ - Conceitos Básicos e Algoritmos -, dos autores Pimenta Rodrigues, Pedro Pereira e Manuela Sousa, editora FCA (mais informações sobre o mesmo consultar isto).

"São bissextos os anos que sejam múltiplos de 4 sem serem múltiplos de 100. Sendo múltiplos de 100, são bissextos os múltiplos de 400."

Seja x o ano em questão. x será bissexto sse (se e só se):

x%4==0 e x%100!=0;
OU
x%100==0 e x%400==0;


Pensando no ano que agora começa (2008):
2008%4==0 e 2008%100!=0; (é bissexto)


Pensando no ano 2000:
2000%4==0 e 2000%100==0; (por esta não é bissexto)
2000%100==0 e 2000%400==0; (mas por esta é bissexto)


Como se trata de uma condição do tipo OU (ou múltiplo de 4 e não múltiplo de 100 OU múltiplo de 100 e múltiplo de 400), desde que uma das premissas da condição seja verdadeira, toda a condição será verdadeira (daí que no exemplo do ano 2000 baste a 2.ª condição para se considerar o ano bissexto).

Espero ter esclarecido quem necessitava.

Vá, cumps
 
Código:
bool anoBissexto(Data data)
{
    bool bi = false;

    //esta é a condição para um ano ser bissexto.
    if (data.getAno() % 400 == 0 || data.getAno() % 4 == 0 && data.getAno() % 100 != 0)
        bi = true;

    return bi;
}
Fica aqui uma função que determina se um ano era bissexto ou não (em C++). Esta função recebia uma Data (criada com o construtor da Classe Data) e retornava true se fosse bissexto.
 
Alguém me pode ajudar a fazer um algoritmo em C que converta um numero inteiro em segundos a partir de 1970 para um data com a seguinte estrutura:


{
int seg;
int mm;
int hh;
int dd;
int mm;
int ano;

}

Cumps...

Código:
#include <stdio.h>
#include <time.h>

int main (void) {

//O tempo em segundos desde 1 JAN 1970 00:00:00 ate este momento
printf ("%d\n", time((time_t*)NULL));

//Um apontador time_t com o mesmo tempo(uns milesimos de segundo adiantado, dependendo do processador)
time_t t = time((time_t*)NULL);

//Uma struct tm que ja existe da biblioteca do c
struct tm tempo;

/* Composicao da struct tm
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
}
*/

//Converter para uma struct tm, um time_t
tempo = *localtime_r(&t, &tempo);

//guardar para uma string um output desejado
char str[40];
strftime(str, (sizeof(char)*40),"DATA: \t%d-%m-%y \nHORA: \t%H:%M:%S",&tempo);

printf("%s\n", str);
return 0;
}

Um pequeno programa que fiz, pode ser que ajude a perceber os tempos.
Se tiveres duvidas nas funções, é so fazer man funcao.

Cumps ;)
 
Última edição:
Pessoal fiz aqui a minha funcção em C para converter segundos a partir de 1970 em um data.

Tá um pouco grande mas penso que funca. Vejam se tá tudo ok e se pode melhorar alguma coisa.


Cumps...

FlowDate SecToDate(char * dat)
{
FlowDate date;
int n=1;
n=atoi(dat);
date.y=1970;

//ANOS
while(n>31622400)
{

if(bissexto(date.y+1))
{
n=n-31622400;
date.y=date.y+1;
}
else
{
n=n-31536000;
date.y=date.y+1;
}
}


if(!bissexto(date.y+1) && n>31536000)
{
n=n-31536000;
date.y=date.y+1;
}


//MESES

date.m=1;

//JANEIRO
if(n>=2678400)
{
n=n-2678400;
date.m=date.m+1;
}

int fev=2419200;

if(bissexto(date.y+1))
fev=2505600;

//FEVEREIRO
if(n>=fev)
{
n=n-fev;
date.m=date.m+1;
}


//MARCO
if(n>=2678400)
{
n=n-2678400;
date.m=date.m+1;
}

//ABRIL
if(n>=2592000)
{
n=n-2592000;
date.m=date.m+1;
}

//MAIO
if(n>=2678400)
{
n=n-2678400;
date.m=date.m+1;
}

//JUNHO
if(n>=2592000)
{
n=n-2592000;
date.m=date.m+1;
}


//JULHO
if(n>=2678400)
{
n=n-2678400;
date.m=date.m+1;
}

//AGOSTO
if(n>=2678400)
{
n=n-2678400;
date.m=date.m+1;
}

//SETEMBRO
if(n>=2592000)
{
n=n-2592000;
date.m=date.m+1;
}

//OUTUBRO
if(n>=2678400)
{
n=n-2678400;
date.m=date.m+1;
}

//NOVEMBRO
if(n>=2592000)
{
n=n-2592000;
date.m=date.m+1;
}


//DIAS
date.dd=1;

while(n>=86400)
{
date.dd=date.dd+1;
n=n-86400;
}

//HORA
date.hh=00;

while(n>=3600)
{
date.hh=date.hh+1;
n=n-3600;
}

//MINUTOS

date.mm=00;

while(n>=60)
{
date.mm=date.mm+1;
n=n-60;
}

//SEGUNDOS
date.ss=n;


printf("\nANO:\t%d\n",date.y);
printf("MES:\t%d\n",date.m);
printf("DIA:\t%d\n",date.dd);
printf("HORA:\t%d\n",date.hh);
printf("MINUTOS:\t%d\n",date.mm);
printf("SEGUNDOS:\t%d\n",date.ss);


return date;
}
 
Chegaste a correr o código que postei acima, ou não te deste ao trabalho? Ou não percebeste? Ou não faz aquilo que queres?

Eu só me dei ao trabalho de ler a tua função na diagonal, mas está extremamente confusa, e imensamente gigante.
Cumps.
 
Back
Topo