Frammenti di timestamp Unix in C
Esempi C per ottenere il timestamp Unix attuale, convertire i secondi epoch in una data leggibile con strftime() e costruire timestamp da date di calendario con timegm().
#include <time.h>
time_t ts = time(NULL);#include <time.h>
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
long ms = (long)ts.tv_sec * 1000L + ts.tv_nsec / 1000000L;#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"#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);#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#include <time.h>
time_t start = time(NULL);
/* ... work ... */
time_t end = time(NULL);
double elapsed = difftime(end, start);Basi dei timestamp in C
Il C rappresenta il tempo Unix come time_t, un tipo intero con segno definito in <time.h>. Sui sistemi a 64 bit, time_t è a 64 bit e immune all'overflow dell'anno 2038. Sui sistemi a 32 bit è ancora a 32 bit su molte piattaforme; controlla sizeof(time_t) per confermarlo. La funzione standard time(NULL) restituisce il tempo Unix corrente in secondi.
gmtime vs localtime
gmtime() converte un time_t in un struct tm in UTC. localtime() converte nel fuso locale del sistema host. Usa sempre gmtime() quando ti serve un risultato riproducibile e indipendente dal fuso. Entrambe le funzioni restituiscono un puntatore a un struct statico condiviso; copia il risultato in una variabile locale struct tm se ti serve tra chiamate di funzione.
Note di produzione per C
Preferisci clock_gettime(CLOCK_REALTIME) a gettimeofday() per la precisione sotto il secondo; POSIX segna gettimeofday() come obsoleto. Usa timegm() (GNU/BSD) o un equivalente portabile quando converti date di calendario in timestamp UTC; mktime() interpreta il suo input come ora locale, producendo silenziosamente risultati errati in ambienti non UTC.
- Controlla sizeof(time_t) sui target embedded; il time_t a 32 bit va in overflow a gennaio 2038
- Usa gmtime_r() e localtime_r() nel codice multithread per evitare race condition
- Le stringhe di formato di strftime() sono indipendenti dalla locale; preferisci %Y-%m-%d a %x per l'interoperabilità
- timegm() non è in POSIX; usa _mkgmtime() su Windows o implementalo manualmente con mktime() + offset UTC
Convertire l'ora Linux: date(1), time_t, gmtime, strftime
Le ricerche di «convert linux time» o conversione di timestamp Linux di solito indicano il comando shell date(1) o le funzioni time_t della libreria C qui sotto. Linux memorizza il timestamp Unix come time_t — con segno a 32 bit sui sistemi legacy (limite Y2038), con segno a 64 bit sui moderni.
- Shell (GNU date): date -u -d @1700000000 — epoch → data UTC
- Shell (BSD/macOS): date -ur 1700000000 — nota -r invece di -d @
- Shell epoca corrente: date +%s (secondi), date +%s%3N (ms, solo GNU)
- Libreria C: time_t t = time(NULL); struct tm *u = gmtime(&t); strftime(buf, sizeof(buf), '%Y-%m-%dT%H:%M:%SZ', u);
- Libreria C: timegm(struct tm *) restituisce un time_t per un'ora di calendario UTC
- POSIX time_t: con segno a 32 bit va in overflow il 2038-01-19; il time_t a 64 bit è la soluzione moderna
Tempo epoch Linux, timestamp Linux a ora, convertitore Linux online
Varianti: «linux epoch time» (tempo Unix su Linux), «linux timestamp to time» (epoch → orologio), «linux timestamp converter online» (questa pagina).
- Linux epoch time / linux epoch time — uguale al tempo Unix; valore corrente: date +%s
- Linux timestamp to time / linux timestamp to time — date -u -d @1700000000 restituisce l'ora dell'orologio in UTC
- Linux timestamp converter online / linux timestamp converter online — questa pagina è l'equivalente nel browser di date(1)
FAQ
- Quale tipo dovrei usare per i timestamp Unix in C?
- Usa time_t per la precisione al secondo e int64_t (da <stdint.h>) quando devi memorizzare millisecondi o nanosecondi. Evita int o long perché le loro dimensioni dipendono dalla piattaforma.
- Come ottengo i millisecondi in C?
- Usa clock_gettime(CLOCK_REALTIME, &ts) da <time.h>. Il risultato è in ts.tv_sec (secondi) e ts.tv_nsec (nanosecondi). Calcola i millisecondi come ts.tv_sec * 1000LL + ts.tv_nsec / 1000000.