I formati dei timestamp Unix spiegati

Un riferimento completo di tutti i formati di timestamp Unix — secondi, millisecondi, microsecondi, ISO 8601 e RFC 2822 — con esempi che mostrano quale formato usa ogni linguaggio e database.

Unix time in secondi — il formato universale

Il formato più comune: un intero a 32 o 64 bit che conta i secondi interi dal 1° gennaio 1970 00:00:00 UTC. Attualmente un numero di 10 cifre intorno a 1,7 miliardi.

  • Esempio: 1700000000 = 2023-11-15 06:13:20 UTC
  • Usato da: Python time.time(), PHP time(), Go time.Now().Unix(), Ruby Time.now.to_i, C time(NULL)
  • Memorizzato come: int a 32 bit (legacy, anno max 2038), int a 64 bit (moderno, sicuro per miliardi di anni)
  • Database: MySQL UNIX_TIMESTAMP(), PostgreSQL EXTRACT(EPOCH FROM NOW())::BIGINT

Unix time in millisecondi — il formato di JavaScript

Millisecondi dall'epoch Unix: un intero di 13 cifre con precisione al millisecondo. È il formato che l'oggetto Date di JavaScript usa internamente.

  • Esempio: 1700000000000 = 2023-11-15 06:13:20.000 UTC
  • Usato da: JavaScript Date.now(), Java System.currentTimeMillis(), .NET DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
  • Per convertire in secondi: Math.floor(ms / 1000)
  • Per convertire dai secondi: seconds * 1000

ISO 8601 — lo standard leggibile dall'uomo

ISO 8601 è uno standard internazionale per rappresentare date e orari come stringhe. A differenza dei timestamp Unix è autodescrittivo: il formato codifica data/ora e l'offset del fuso.

  • 2023-11-15T06:13:20Z — UTC (il suffisso Z significa UTC)
  • 2023-11-15T01:13:20-05:00 — con offset UTC esplicito (EST)
  • 2023-11-15T06:13:20.000Z — con millisecondi
  • JavaScript: date.toISOString() restituisce sempre UTC con suffisso Z
  • Python: datetime.isoformat(), Go: time.Format(time.RFC3339)

RFC 2822 — formato data per email e HTTP

RFC 2822 (chiamato anche RFC 1123 per HTTP) è il formato data usato negli header email e nelle risposte HTTP. Il Date.toUTCString() di JavaScript restituisce questo formato.

  • Esempio: Wed, 15 Nov 2023 06:13:20 GMT
  • Usato in: header di risposta HTTP (Last-Modified, Date, Expires), header email (Date:)
  • JavaScript: date.toUTCString()
  • Meno comune nelle API moderne, ma ancora molto diffuso nell'infrastruttura web

Come riconoscere il formato del timestamp

Quando ricevi un valore di timestamp sconosciuto, usa queste regole per identificarne il formato:

  • 10 cifre, inizia con 1 → secondi Unix (es. 1700000000)
  • 13 cifre, inizia con 1 → millisecondi Unix (es. 1700000000000)
  • Negativo → secondi o millisecondi Unix prima del 1970
  • Contiene T o Z → ISO 8601 (es. 2023-11-15T06:13:20Z)
  • Contiene una virgola o il nome del giorno → RFC 2822 (es. Wed, 15 Nov 2023 ...)
  • 16 cifre → microsecondi (dividi per 1,000,000 per i secondi)
  • 19 cifre → nanosecondi (dividi per 1,000,000,000 per i secondi)

Microsecondi e nanosecondi

Alcuni sistemi ad alta precisione usano unità più piccole del millisecondo. Sono rare nel codice applicativo ma compaiono nei sistemi di basso livello, negli interni dei database e negli strumenti di osservabilità.

  • Microsecondi (µs): intero di 16 cifre — Rust SystemTime as_micros(), PostgreSQL clock_gettime()
  • Nanosecondi (ns): intero di 19 cifre — Go time.Now().UnixNano(), Rust SystemTime as_nanos()
  • PostgreSQL EXTRACT(EPOCH) restituisce un numero in virgola mobile con i microsecondi come parte frazionaria
  • Per convertire i nanosecondi in secondi: dividi per 1,000,000,000 (1e9)

FAQ sui formati dei timestamp Unix

Quante cifre ha un timestamp Unix?
Un timestamp Unix moderno in secondi ha 10 cifre (intorno a 1,7 miliardi); in millisecondi 13. I microsecondi hanno 16 cifre e i nanosecondi 19.
Qual è la differenza tra Unix time e ISO 8601?
Unix time è un singolo numero di secondi o millisecondi dal 1970 UTC e non porta fuso. ISO 8601 è una stringa autodescrittiva come 2023-11-15T06:13:20Z che codifica data, ora e offset.
Come capisco se un timestamp è in secondi o millisecondi?
Conta le cifre: 10 sono secondi, 13 sono millisecondi. Se un valore si converte in una data vicina al 1970 o molto lontana, l'unità è stata letta male.