Ir para conteúdo
Fórum Script Brasil
  • 0

Data do PC


luisg5

Pergunta

5 respostass a esta questão

Posts Recomendados

  • 0

primeiro você precisa saber o que é o Era Unix porque tudo o que é relacionado com datas, cronometro etc provem do Era unix. basicamente é um "checkpoint" cravado em uma data. Se você por exemplo medir o tempo desde ontem a meia noite, mas o fizer em segundos depois de 24 horas você vai obter um X valor que é o numero em segundos que passou de ontem para hoje. O valor de que contem X em segundos que foi medido desde ontem a meia noite a hoje a meia noite é de 86400, é dizer, ontem a meia noite o tempo era X = 0, e depois de ir contando cada segundo que passou, hoje a meia noite X = 86400, esse 86400 é o tempo que passou em segundos. Se eu pegar e dividir 86400 por 60 obtenho o numero de minutos que passou, e se eu voltar a dividir novamente por 60 vou obter a quantidade de horas. Posso saber que se passaram 24 horas na realidade passou 1 dia. Isso é tudo teoria, não é nada importante ao nosso caso ainda mas essa teoria se aplica ao seu caso. O tempo inicial que usamos para medir foi ontem a meia noite, o problema é que cada pessoa pode querer medir desde uma data especial e não daria certo querer medir o tempo, por isso existe o Era Unix que nada mais é que um tempo que foi tomado como referencia no tempo. Sabemos que dia era, sabemos que hora foi, ano, minutos, resumindo tudo. Então se você quer trabalhar com datas você precisa saber o que é o Era Unix.

Por que devemos saber o que é o era unix? Imagina que hoje é segunda feira ao meio dia, agora imagina 3 dias depois. Que teríamos que fazer para saber que dia seria 3 dias depois? Simples... teríamos que somar 3 vezes 86400 segundos. Fácil né? Tá... talvez não seja tanto kkk. vamos com exemplo. Em c/c++ temos uma função chamada time que aceita um parâmetro por referencia do tipo time_t que nada mais será que um define de um inteiro sem signo super bombado tipo long long ou sei lá e nem me importa muito(buscar você kkk). O caso é que a função time guarda em segundos o tempo que passou desde o Era Unix até esse exato momento na variável time_t que aplicando as divisões que indiquei anteriormente dizem a quantidade de minutos que passou. E como vimos podemos saber tudo... podemos saber quantos minutos passou, ou dias, ou meses ou anos décadas etc, aplicando um algoritmo apropriado de divisão. Por sorte não precisamos fazer isso, pois C/C++ já possuem funções para isso. C por exemplo proporciona uma estrutura chamada struct tm que guarda os o resultado dessas divises que  proporciona outra função chamada localtime . Resumindo a função time pega e guarda em uma variável do tipo time_t os segundos que passaram desde Era Unix(Buscar informação para saber qual é), dai a função localtime pega essa variável que possui os segundos e transforma em dados(horas, segundos, anos tec), esses dados é a hora exata do sistema, foi conseguida aplicando um complexo algoritmo de divisões dos segundos desde Era Unix até o exato momento que foi invocado a função time. Em todos esses links que estou passando existe exemplos porem vou lhe proporcionar um com tudo.

 

#include<stdio.h>
#include <time.h>

int main(){
    time_t segundos; // vai guradar os segundos que passou desde Era Unix. O tipo é time_t é um define de long int
    
    time(&segundos); //medimos o tempo que passou desde Era unix e guardamos em 'segundos'.
    
    printf("Passaram %ld segundos desde o dia 1 de janeiro de 1970 a 00:00:00 horas(Era Unix)\n\n", segundos); //Podemos ver quantos segundos passaram.
    
    struct tm * timeinfo; //Ponteiro que vai apontar aos dados tipo struct tm. Para ver o que vai guardar essa estrutura olhe aqui-> http://www.cplusplus.com/reference/ctime/tm/ 
    
    timeinfo = localtime (&segundos); // Local time pega os segundos e aplica um algoritmo de divisão peculiar tendo em conta coisas como ano bisexto, etc, para retornar uma data que nada mais é que o numero em segundos que passou desde era unix dividido por X valores para obter numero de anos, meses, dias, horas, minutos, segundos que que nada mais é que uma data.
    
    //agora vamos imprimir os dados da estrutura com ajuda da função asctime que transforma em tudo o que está na estrutura em uma string  
    printf ("Data e hora Atual: %s\n\n", asctime(timeinfo));
    
    //Mas podemos usar diretamente os dados se quiser para imprimir algo mais amigavel.
    printf("Dia: %d Hora: %d:%d\n\n", timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min );
    
    
    return 0;
}

Acho que mais ou menos da para pegar o conceito e saber trabalhar com horas. Agora você pode usar também clock_t e a função clock para fazer cronômetros. Também pode usar  diftime para saber quanto tempo passou em segundos desde uma data até outra.

Se quiser montar strings com toda essa informação de forma mais contundente deveria dar uma olhada também em strftime que nada mais é que permite você montar uma bonita string com formato usando logicamente uma gama de especificadores de formato para criar strings ou imprimir corretamente tudo o relacionado com datas.

 

Lhe recomendo dar uma boa estudada em todas as funções da time.h

Sorte.
 

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado 'vangodp' pela ajuda e toda a explicação da Era Unix!

Tentei fazer o que você explicou usando diretamente os dados, para ficar por exemplo 30/11/2016, mas está dando algum erro que está ficando 30/10/116, não sei o por que do erro, sendo que usei timeinfo->tm_mday, timeinfo->tm_mon, timeinfo->tm_year, teria como me explicar? Segue o meu código:

#include<stdio.h>
#include <time.h>

int main(){
    time_t segundos;    
    time(&segundos);        
    struct tm * timeinfo;     
    timeinfo = localtime (&segundos);    
    printf("Dia: %d/%d/%d", timeinfo->tm_mday, timeinfo->tm_mon, timeinfo->tm_year );    
    return 0;
}

Obrigado pela atenção

Link para o comentário
Compartilhar em outros sites

  • 0

Ok.. perdão. Não sei se falei asctime te faz certos calculos para lhe mostrar os dados da struct tm corretamente. Se for um momento para a pagina de referencia sobre struct tm, poderá ver que lá a referencia sobre o dado membro tm_year dice algo tal como "years since 1900" que traduzido quer dizer anos desde 1900. O que quer dizer isso? Quer dizer que vai imprimir quantos anos passou desde 1900, que é mais ou menos 2016-1900=116. Como você estamos fazendo a mão isso devemos ter cuidado pois pode sair algo mal. Para corregir isso é questão de somar 1900 a timeinfo->tm_year ficando a linha do printf assim:
printf("Dia: %d/%d/%d", timeinfo->tm_mday, timeinfo->tm_mon, timeinfo->tm_year+1900 );  Tente ler a referencia vei. Tudo o que você precisa saber está lá.

Link para o comentário
Compartilhar em outros sites

  • 0

você deveria usar strftime para obter uma string livre de erros:

/* strftime example */
#include <stdio.h>      /* puts */
#include <locale.h>     /*setlocale*/
#include <time.h>       /* time_t, struct tm, time, localtime, strftime */

int main () {
    time_t rawtime;
    struct tm * timeinfo;
    char buffer [80];
    
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    
    setlocale(LC_ALL, "portuguese-brazilian"); // Importante por isso se não em vez de quarta-feira sai Wednesday(ingles) >_<
    strftime ( buffer, 80, "Agora é %I:%M%p %A", timeinfo );
    
    
    //Agora buffer possui 09:49 quarta-feira, você pode concatenar a outras strings usando por exemplo strcat 
    puts ( buffer );
    
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...