C Snippets

Fragmentos de timestamp Unix en C

Ejemplos de C para obtener el timestamp Unix actual, convertir segundos epoch en una fecha legible con strftime() y construir timestamps a partir de fechas de calendario con 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);

Conceptos básicos de marcas de tiempo en C

C representa el tiempo Unix como time_t, un tipo entero con signo definido en <time.h>. En sistemas de 64 bits, time_t es de 64 bits e inmune al desbordamiento del año 2038. En sistemas de 32 bits sigue siendo de 32 bits en muchas plataformas; comprueba sizeof(time_t) para confirmarlo. La función estándar time(NULL) devuelve el tiempo Unix actual en segundos.

gmtime vs localtime

gmtime() convierte un time_t en un struct tm en UTC. localtime() convierte a la zona horaria local del sistema anfitrión. Usa siempre gmtime() cuando necesites un resultado reproducible e independiente de la zona horaria. Ambas funciones devuelven un puntero a un struct estático compartido; copia el resultado en una variable local struct tm si lo necesitas entre llamadas de función.

Notas de producción para C

Prefiere clock_gettime(CLOCK_REALTIME) en lugar de gettimeofday() para precisión por debajo del segundo; POSIX marca gettimeofday() como obsolescente. Usa timegm() (GNU/BSD) o un equivalente portátil al convertir fechas de calendario en marcas de tiempo UTC; mktime() interpreta su entrada como hora local, lo que produce silenciosamente resultados incorrectos en entornos que no son UTC.

  • Comprueba sizeof(time_t) en destinos embebidos; el time_t de 32 bits se desborda en enero de 2038
  • Usa gmtime_r() y localtime_r() en código multihilo para evitar condiciones de carrera
  • Las cadenas de formato de strftime() son independientes de la configuración regional; prefiere %Y-%m-%d sobre %x para interoperabilidad
  • timegm() no está en POSIX; usa _mkgmtime() en Windows o impleméntalo manualmente con mktime() + desfase UTC

Convertir la hora de Linux: date(1), time_t, gmtime, strftime

Las búsquedas de «convert linux time» o conversión de marcas de tiempo en Linux suelen referirse al comando de shell date(1) o a las funciones time_t de la biblioteca C de abajo. Linux almacena la marca de tiempo Unix como time_t — con signo de 32 bits en sistemas heredados (límite Y2038), con signo de 64 bits en los modernos.

  • Shell (GNU date): date -u -d @1700000000 — epoch → fecha UTC
  • Shell (BSD/macOS): date -ur 1700000000 — fíjate en -r en vez de -d @
  • Shell época actual: date +%s (segundos), date +%s%3N (ms, solo 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 *) devuelve un time_t para una hora de calendario UTC
  • POSIX time_t: con signo de 32 bits se desborda el 2038-01-19; el time_t de 64 bits es la solución moderna

Tiempo epoch de Linux, marca de tiempo de Linux a hora, conversor en línea de Linux

Variantes: «linux epoch time» (tiempo Unix en Linux), «linux timestamp to time» (epoch → reloj de pared), «linux timestamp converter online» (esta página).

  • Linux epoch time / linux epoch time — igual que el tiempo Unix; valor actual: date +%s
  • Linux timestamp to time / linux timestamp to time — date -u -d @1700000000 devuelve la hora de reloj de pared en UTC
  • Linux timestamp converter online / linux timestamp converter online — esta página es el equivalente en navegador de date(1)

FAQ

¿Qué tipo debo usar para marcas de tiempo Unix en C?
Usa time_t para precisión de segundos e int64_t (de <stdint.h>) cuando necesites almacenar milisegundos o nanosegundos. Evita int o long porque sus tamaños dependen de la plataforma.
¿Cómo obtengo milisegundos en C?
Usa clock_gettime(CLOCK_REALTIME, &ts) de <time.h>. El resultado está en ts.tv_sec (segundos) y ts.tv_nsec (nanosegundos). Calcula los milisegundos como ts.tv_sec * 1000LL + ts.tv_nsec / 1000000.