C Snippets

Trechos de timestamp Unix em C

Exemplos de C para obter o timestamp Unix atual, converter segundos epoch em uma data legível com strftime() e construir timestamps a partir de datas de calendário com timegm().

Current Unix timestamp (seconds)
#include <time.h>

time_t ts = time(NULL);
Current timestamp (milliseconds, POSIX)
#include <time.h>

struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
long ms = (long)ts.tv_sec * 1000L + ts.tv_nsec / 1000000L;
Format timestamp as UTC string
#include <time.h>
#include <stdio.h>

time_t ts = 1700000000;
struct tm *tm_info = gmtime(&ts);  // UTC
char buf[64];
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm_info);
printf("%s\n", buf);  // "2023-11-15 06:13:20"
Format timestamp as local time string
#include <time.h>

time_t ts = 1700000000;
struct tm *tm_info = localtime(&ts);  // host timezone
char buf[64];
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm_info);
Timestamp from calendar date (UTC, GNU)
#define _GNU_SOURCE
#include <time.h>

struct tm t = {0};
t.tm_year = 2023 - 1900;  // years since 1900
t.tm_mon  = 10;           // 0-indexed; 10 = November
t.tm_mday = 15;
t.tm_hour = 6;
t.tm_min  = 13;
t.tm_sec  = 20;
time_t ts = timegm(&t);   // GNU/POSIX; use mktime() for local
Time difference in seconds
#include <time.h>

time_t start = time(NULL);
/* ... work ... */
time_t end = time(NULL);
double elapsed = difftime(end, start);

Noções básicas de marcas de tempo em C

O C representa o tempo Unix como time_t, um tipo inteiro com sinal definido em <time.h>. Em sistemas de 64 bits, time_t tem 64 bits e é imune ao estouro do ano 2038. Em sistemas de 32 bits ainda tem 32 bits em muitas plataformas; verifique sizeof(time_t) para confirmar. A função padrão time(NULL) retorna o tempo Unix atual em segundos.

gmtime vs localtime

gmtime() converte um time_t em um struct tm em UTC. localtime() converte para o fuso local do sistema host. Use sempre gmtime() quando precisar de um resultado reproduzível e independente de fuso. Ambas as funções retornam um ponteiro para um struct estático compartilhado; copie o resultado para uma variável local struct tm se precisar dele entre chamadas de função.

Notas de produção para C

Prefira clock_gettime(CLOCK_REALTIME) a gettimeofday() para precisão abaixo do segundo; o POSIX marca gettimeofday() como obsolescente. Use timegm() (GNU/BSD) ou um equivalente portátil ao converter datas de calendário em marcas de tempo UTC; mktime() interpreta sua entrada como hora local, o que produz silenciosamente resultados errados em ambientes não UTC.

  • Verifique sizeof(time_t) em alvos embarcados; o time_t de 32 bits estoura em janeiro de 2038
  • Use gmtime_r() e localtime_r() em código multithread para evitar condições de corrida
  • As strings de formato de strftime() são independentes de localidade; prefira %Y-%m-%d a %x para interoperabilidade
  • timegm() não está no POSIX; use _mkgmtime() no Windows ou implemente manualmente com mktime() + deslocamento UTC

Converter o tempo do Linux: date(1), time_t, gmtime, strftime

Buscas por «convert linux time» ou conversão de marca de tempo no Linux geralmente se referem ao comando de shell date(1) ou às funções time_t da biblioteca C abaixo. O Linux armazena a marca de tempo Unix como time_t — com sinal de 32 bits em sistemas legados (limite Y2038), com sinal de 64 bits nos modernos.

  • Shell (GNU date): date -u -d @1700000000 — epoch → data UTC
  • Shell (BSD/macOS): date -ur 1700000000 — note -r em vez de -d @
  • Shell época atual: date +%s (segundos), date +%s%3N (ms, apenas GNU)
  • Biblioteca C: time_t t = time(NULL); struct tm *u = gmtime(&t); strftime(buf, sizeof(buf), '%Y-%m-%dT%H:%M:%SZ', u);
  • Biblioteca C: timegm(struct tm *) retorna um time_t para uma hora de calendário UTC
  • POSIX time_t: com sinal de 32 bits estoura em 2038-01-19; o time_t de 64 bits é a solução moderna

Tempo epoch do Linux, marca de tempo do Linux para hora, conversor Linux online

Variantes: «linux epoch time» (tempo Unix no Linux), «linux timestamp to time» (epoch → relógio de parede), «linux timestamp converter online» (esta página).

  • Linux epoch time / linux epoch time — igual ao tempo Unix; valor atual: date +%s
  • Linux timestamp to time / linux timestamp to time — date -u -d @1700000000 retorna a hora de relógio de parede em UTC
  • Linux timestamp converter online / linux timestamp converter online — esta página é o equivalente no navegador de date(1)

FAQ

Que tipo devo usar para marcas de tempo Unix em C?
Use time_t para precisão de segundos e int64_t (de <stdint.h>) quando precisar armazenar milissegundos ou nanossegundos. Evite int ou long porque seus tamanhos dependem da plataforma.
Como obtenho milissegundos em C?
Use clock_gettime(CLOCK_REALTIME, &ts) de <time.h>. O resultado está em ts.tv_sec (segundos) e ts.tv_nsec (nanossegundos). Calcule os milissegundos como ts.tv_sec * 1000LL + ts.tv_nsec / 1000000.