Formati dei timestamp Unix spiegati
Un riferimento completo di tutti i formati dei timestamp Unix — secondi, millisecondi, microsecondi, ISO 8601 e RFC 2822 — con esempi che mostrano quale formato usa ogni linguaggio e database, e come distinguerli a colpo d'occhio.
Tutti i formati dei timestamp Unix a colpo d'occhio
Un timestamp Unix è solo un numero, e il suo formato è in realtà solo la sua unità — con quanta finezza conta dal 1° gennaio 1970 UTC. L'unità è quasi sempre leggibile dal numero di cifre: 10 cifre sono secondi, 13 sono millisecondi, 16 sono microsecondi, 19 sono nanosecondi. I due formati di stringa, ISO 8601 e RFC 2822, sono invece autodescrittivi. La tabella sotto è l'intero panorama; le sezioni successive coprono ogni formato e come distinguerli.
| Formato | Cifre | Esempio | Usato da |
|---|---|---|---|
| Secondi | 10 | 1700000000 | Python, PHP, Go, Ruby, C, SQL |
| Millisecondi | 13 | 1700000000000 | JavaScript, Java, .NET |
| Microsecondi | 16 | 1700000000000000 | PostgreSQL, Rust |
| Nanosecondi | 19 | 1700000000000000000 | Go UnixNano, sistemi di tracing |
| ISO 8601 | stringa | 2023-11-15T06:13:20Z | API, log (autodescrittivo) |
| RFC 2822 | stringa | Wed, 15 Nov 2023 06:13:20 GMT | E-mail, header HTTP |
Il tempo Unix in secondi — il formato universale
Il formato più comune: un intero a 32 o 64 bit che conta il numero di 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
Il tempo Unix in millisecondi — il formato di JavaScript
Millisecondi dall'epoch Unix: un intero di 13 cifre che fornisce 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()
- Convertire in secondi: Math.floor(ms / 1000)
- Convertire da secondi: seconds * 1000
ISO 8601 — lo standard leggibile dall'uomo
L'ISO 8601 è uno standard internazionale per rappresentare date e ore come stringhe. A differenza dei timestamp Unix, è autodescrittivo: il formato codifica sia la data/ora sia l'offset di 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 di data e-mail e HTTP
L'RFC 2822 (aggiornato dall'RFC 5322 per l'e-mail, e rispecchiato dall'RFC 9110 per HTTP) è il formato di data leggibile usato negli header e-mail 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 e-mail (Date:)
- JavaScript: date.toUTCString()
- Meno comune nelle API moderne ma ancora ampiamente incontrato nell'infrastruttura web
Come rilevare il formato del timestamp
Quando ricevi un valore di timestamp sconosciuto, queste regole ne identificano il formato. Il numero di cifre risolve ogni caso numerico; i due formati di stringa sono ovvi a vista.
| Indizio | Formato |
|---|---|
| 10 cifre | Secondi Unix |
| 13 cifre | Millisecondi Unix |
| 16 cifre | Microsecondi |
| 19 cifre | Nanosecondi |
| Contiene T o Z | ISO 8601 |
| Virgola o nome del giorno | RFC 2822 |
| Intero negativo | Secondi o millisecondi prima del 1970 |
- Verifica di buon senso: qualsiasi valore numerico dovrebbe decodificare in una data credibile dell'era attuale (circa 2001–2038 per secondi a 10 cifre)
- Una data vicina al 1970 o a migliaia di anni significa che l'unità è stata letta male
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
- Convertire i nanosecondi in secondi: dividere per 1.000.000.000 (1e9)
Risoluzione e precisione dei sottosecondi
Ogni formato sopra porta una risoluzione temporale diversa. Scegliere un formato significa scegliere con quanta finezza puoi distinguere due momenti — da un secondo fino a un nanosecondo.
- Risoluzione a 1 secondo: secondi Unix (10 cifre), POSIX time_t tradizionale
- 1 millisecondo: JavaScript Date, MongoDB BSON Date, Java Instant.toEpochMilli()
- 1 microsecondo: timestamp Chrome/WebKit, Python datetime.timestamp(), PostgreSQL timestamp precision 6
- 100 nanosecondi: Windows FILETIME, .NET DateTime.Ticks
- 1 nanosecondo: Java Instant (precisione piena), Go time.UnixNano(), JS Temporal.Instant.epochNanoseconds (BigInt)
- Picosecondo e oltre: formato wire PTP/IEEE 1588 (1/2^32 di secondo), campo frazione di NTP
- Scegli la risoluzione più grossolana che soddisfa le tue esigenze — la precisione sotto il secondo si perde spesso nella serializzazione JSON o nel round-trip di stringa
- Quando converti tra formati, passa per millisecondi o nanosecondi Unix (via BigInt) — è il minimo comune denominatore che preserva la precisione
Convertitori di formato di timestamp
Converti tra il tempo Unix e i formati di timestamp specifici di piattaforma che incontri sul campo:
FAQ
- Quante cifre ha un timestamp Unix?
- Un timestamp Unix moderno in secondi ha 10 cifre (circa 1,7 miliardi); in millisecondi ha 13 cifre. I microsecondi hanno 16 cifre e i nanosecondi 19 cifre.
- Quale formato di timestamp usa JavaScript?
- Il Date di JavaScript lavora in millisecondi — Date.now() restituisce un timestamp di 13 cifre in millisecondi, e new Date(ms) si aspetta millisecondi. Moltiplica i secondi Unix per 1000 prima di passarli a Date.
- Qual è la differenza tra il tempo Unix e l'ISO 8601?
- Il tempo Unix è un singolo numero di secondi o millisecondi dal 1970 UTC e non porta alcun fuso. L'ISO 8601 è una stringa autodescrittiva come 2023-11-15T06:13:20Z che codifica la data, l'ora e l'offset.
- Cos'è il formato di data RFC 2822?
- L'RFC 2822 (aggiornato dall'RFC 5322) è il formato di data leggibile usato nell'e-mail e negli header HTTP, come "Wed, 15 Nov 2023 06:13:20 GMT". JavaScript lo produce con date.toUTCString().
- Come rilevo se un timestamp è in secondi o in millisecondi?
- Conta le cifre: un valore di 10 cifre è in secondi, uno di 13 cifre è in millisecondi. Se un valore si converte in una data vicina al 1970 o lontana nel futuro, l'unità è stata letta male.