Rodrigo Strauss :: Blog
Lendo e medindo o tempo em C e C++: função time()
Bom, chega de teoria e encheção de lingüiça e vamos para o código de uma vez por todas. A função mais conhecida para pegar a data e hora é a função time() da C runtime, que retorna quantidade de segundos desde o "Unix Epoch", que é meia noite (00:00:00) de 1 de Janeiro de 1970.
Características da função time():
- Retorna a quantidade de segundos desde 1 de Janeiro de 1970. Ou seja, a sua precisão máxima é de um segundo. Ou seja, não serve para medir performance. (ou seja, vou explicar mais sobre isso depois)
- O horário retornado é GMT, para pegar o horário local é necessário fazer manualmente o cálculo para ajuste de fuso horário. Para usar o horário local é necessário usar a função get_timezone (ou _tzset no Visual C++) para ler a diferença do fuso que você usará para fazer o cálculo depois
- Como o retorno da função é um número inteiro, é muito fácil fazer contas com ele. Para avançar a data em dois dias, por exemplo, é só somar [60 * 60 * 24 * 2].
- Durante o inicio dos tempos do unix o retorno era do tipo int de 32 bits. Fazendo uma conta simples com os limites de um inteiro, vemos que o limite de medição é algum dia no ano de 2038, criando uma nova e repaginada versão do bug do milênio. Nas versões mais atuais dessa função o retorno é um int64, o que empurra o limite para uma data bem longínqua, quando provavelmente não haverá mais programadores vivos no universo.
- Por ser uma função da C runtime, está disponível em qualquer compilador C e C++ (qualquer == qualquer compilador não-exótico para plataformas não-exóticas). É provavelmente a função mais multiplataforma de todas que eu vou mostrar
Como um trecho de código vale mais do que 0xFFFFFFFFFFFFFFFF palavras, here we go:
#include <stdio.h> #include <tchar.h> #include <time.h> #include <iostream> #include <iomanip> #include <string> using namespace std; void print_time(time_t t) { tm* formatted_time; // // essa função "quebra" essa quantidade de segundos e dia, mês, ano, etc // formatted_time = gmtime(&t); // // isso vai mostrar algo como "2009/12/07 14:42:57" // note que é necessário somar 1900 na data para pegar o ano corrente // cout << setfill('0') << setw(4) << formatted_time->tm_year+1900 << "/" << setw(2) << formatted_time->tm_mon+1 << "/" << setw(2) << formatted_time->tm_mday << " " << setw(2) << formatted_time->tm_hour << ":" << setw(2) << formatted_time->tm_min << ":" << setw(2) << formatted_time->tm_sec << endl; } int main() { time_t t; // // pega o número de segundos desde 1970 // t = time(NULL); // // mostra na tela, formatado // print_time(t); // // pega o fuso horário da máquina para pegar o horário local // ao invés de GMT. // long timezone; _tzset(); // carrega as configurações de fuso _get_timezone(&timezone); // lê a diferença do fuso cout << timezone << endl; // // ajusta o horário pelo fuso // t -= timezone; print_time(t); // // avança da data em 2 dias // t += 48 * 60 * 60; // // mostra novamente // print_time(t); return 0; }
Esse código foi feito no Visual C++ (Windows). Existem pequenas diferenças nos nomes das funções no Linux, mas o conceito é o mesmo. Consulte sua documentação preferida para detalhes específicos.
Em 16/12/2009 22:09, por Rodrigo Strauss





Olá,
aqui vai um link bacana pra quem quiser entender como funciona o relógio no Windows... li ontem e achei coincidência ler outro artigo sobre relógios hoje.
http://blogs.msdn.com/w32time/archive/2007/10/31/a-tale-of-t...
[]s,
Vinicius