Convertitore di timestamp Unix

Converti un timestamp Unix in una data in qualsiasi fuso orario, e viceversa: secondi o millisecondi riconosciuti da soli, con ISO 8601 e quanto tempo fa era.

Tempo Unix corrente
Rilevamento…
Input

Che cos’è un timestamp Unix

Un timestamp Unix — chiamato anche tempo epoch o tempo POSIX — è un singolo numero che conta quanti secondi sono passati dalle 00:00:00 UTC del 1º gennaio 1970, un istante noto come epoch di Unix. Trattandosi di un solo intero, senza fuso orario, senza calendario e senza formattazione, è il formato a cui i computer ricorrono ogni volta che un istante va memorizzato, ordinato, confrontato o spedito in rete. È ciò che sta dietro la colonna «created_at» del tuo database, dietro i claim «iat» ed «exp» di un JWT, dietro l’mtime di un file e dietro i timestamp di praticamente ogni file di log che ti capiterà di leggere.

Il rovescio della medaglia è che un numero nudo non dice nulla a una persona. 1716197600 è un istante perfettamente valido, ma a colpo d’occhio non sai se sia martedì scorso o tre anni fa. Questa traduzione, in entrambe le direzioni, è ciò che fa questo strumento.

Secondi o millisecondi: l’ambiguità che morde

La convenzione originale di Unix conta secondi interi, ed è quello che ottieni da date +%s in una shell, da time() in PHP e da time.time() in Python una volta troncato. JavaScript, Java e molti altri contano invece millisecondi: Date.now() restituisce un numero mille volte più grande. Entrambi si chiamano «timestamp», e confonderli è uno dei bug sulle date più comuni che esistano.

Il guasto è silenzioso, non rumoroso. Leggi un valore in millisecondi come secondi e la data atterra decine di migliaia di anni nel futuro; leggi un valore in secondi come millisecondi e tutto crolla al gennaio 1970. Nessuno dei due solleva un errore: semplicemente ottieni una data sbagliata che sembra vera.

Questo strumento tira a indovinare in base all’ordine di grandezza del numero e poi ti dice che cosa ha indovinato, proprio accanto al risultato. I secondi epoch di oggi hanno dieci cifre e i millisecondi tredici, quindi la deduzione è quasi sempre corretta — ma «quasi» non basta per un valore che stai per incollare in una segnalazione di bug, ed è per questo che l’interpretazione è sempre visibile e sempre a un clic dall’essere cambiata.

Fusi orari, UTC e perché «locale» è scivoloso

Un timestamp Unix non ha fuso orario. Identifica un istante: 1716197600 è 2024-05-20T09:33:20Z, e quello stesso istante è contemporaneamente le 10:33 a Londra, le 12:33 a Gerusalemme e le 18:33 a Tokyo, perché quel giorno Londra e Gerusalemme sono sull’ora legale e il Giappone non ne ha affatto. Il fuso orario non fa parte del valore: è la lente attraverso cui lo guardi.

Per questo lo strumento mostra più lenti insieme. UTC è il riferimento neutro su cui concordano tutti i server e tutti i log. La tua ora locale è quella che segnala il tuo dispositivo, mostrata con il nome del fuso (per esempio Europe/Berlin) così sai sempre quale lente l’ha prodotta: il rilevamento avviene nel tuo browser, quindi chi visita da Berlino vede l’ora di Berlino e chi visita da Tokyo quella di Tokyo. La terza riga è un fuso qualsiasi scelto dal database IANA completo, ed è la riga che ti serve quando leggi il log di un server che sta altrove.

  • UTC: il riferimento su cui concordano tutti i sistemi, e la cosa giusta da memorizzare e registrare.
  • Locale: lo stesso istante come lo vede il tuo dispositivo, etichettato con il fuso rilevato.
  • Un fuso a tua scelta: per leggere log e tracce da macchine che stanno altrove.
  • ISO 8601: il formato testuale di interscambio, ad es. 2024-05-20T09:33:20.000Z.
  • Relativo: «3 ore fa», per farsi un’idea rapida di quanto sia recente qualcosa.

Gli scarti sono mostrati accanto a ogni orario (+03:00, -04:00) perché non sono fissi: la maggior parte dei fusi si sposta di un’ora con l’ora legale, quindi lo stesso fuso può produrre scarti diversi in periodi diversi dell’anno. Una data vicina a un cambio è esattamente il punto in cui i calcoli a mano sbagliano.

Lavorare con il tempo epoch nella pratica

Ogni linguaggio e ogni shell ha il proprio modo di produrre e leggere valori epoch. Questi vale la pena ricordarli:

date +%s                         # shell: ora corrente in secondi
date -d @1716197600              # shell (GNU): da secondi a data
Date.now()                       # JavaScript: ora corrente in MILLIsecondi
new Date(1716197600 * 1000)      # JavaScript: da secondi a Date
time.time()                      # Python: secondi, come decimale
datetime.fromtimestamp(1716197600, tz=timezone.utc)
SELECT EXTRACT(EPOCH FROM now()) -- PostgreSQL: secondi

Una regola pratica che evita gran parte dei dolori con le date: memorizza e trasmetti gli istanti in UTC — come intero epoch o come stringa ISO 8601 — e converti in un fuso locale solo all’ultimo momento, quando lo mostri davvero a qualcuno. Formattare troppo presto è il modo in cui un bug di fuso orario finisce cotto dentro i tuoi dati invece di restare nel livello di presentazione.

Un’altra cosa da sapere: un contatore di secondi a 32 bit con segno esaurisce il 19 gennaio 2038, il «problema dell’anno 2038». I sistemi moderni usano valori a 64 bit e non corrono rischi, ma i vecchi dispositivi embedded e le colonne di database ereditate sono proprio i posti in cui potresti ancora incontrarlo.

Che cos’è un epoch e perché non tutti i timestamp partono dal 1970

Un epoch, in questo senso, non è che uno zero scelto: l’istante da cui un contatore è definito per iniziare a contare. L’epoch di Unix sono le 00:00:00 UTC del 1º gennaio 1970, ed è stato scelto perché era una data tonda e comoda, non perché derivi da qualcosa: niente nel formato stesso richiede proprio quel giorno. Il primo Unix contava sessantesimi di secondo da uno zero molto più vicino, e il manuale della terza edizione disse senza giri di parole perché non poteva reggere: trentadue bit di sessantesimi garantiscono una crisi ogni 2,26 anni, cioè circa ogni 828 giorni. I secondi interi negli stessi trentadue bit arrivano a centotrentasei anni, o a sessantotto se il contatore ha segno, ed è la data del 2038 qui sopra.

Questa storia è il motivo per controllare un numero lungo prima di fidarsene. Altri sistemi contano da altri zeri e con altre risoluzioni, e leggerne uno come secondi Unix non ti sposta di qualche ora: ti sposta di secoli. Questi sono quelli che più probabilmente ti capiteranno:

  • Windows FILETIME: tick da cento nanosecondi dal 1º gennaio 1601 UTC. Dividi per dieci milioni e sottrai 11644473600 per ottenere secondi Unix; l’istante 1716197600 usato in tutta questa guida è 133606712000000000 in quello schema.
  • .NET DateTime.Ticks: lo stesso tick da cento nanosecondi, ma contato dall’inizio dell’anno 1. L’epoch di Unix sta a 621355968000000000 tick, ed è il numero da sottrarre prima di dividere.
  • La data di riferimento di Apple: secondi dal 1º gennaio 2001 UTC, usata da Cocoa e Core Data. Aggiungi 978307200 per ottenere secondi Unix: 1716197600 lì è 737890400.
  • I numeri seriali di Excel: giorni anziché secondi, contati dal 30 dicembre 1899, perché Excel tratta il 1900 come anno bisestile e non lo era.
  • Il tempo GPS: secondi dal 6 gennaio 1980, contati senza saltare mai un secondo intercalare, così il tempo GPS e UTC non concordano più.

Quest’ultimo indica qualcosa di vero anche per il valore Unix stesso: non è la lettura di un cronometro. POSIX lo definisce come un valore che approssima i secondi trascorsi dall’epoch e impone che ogni singolo giorno sia contato per esattamente 86400 secondi, quindi i secondi intercalari inseriti in UTC non vengono contati affatto. La differenza fra due timestamp Unix è perciò il numero di secondi di calendario che li separano e non il numero di secondi realmente trascorsi, e il valore si capisce meglio come la codifica di una lettura di calendario in UTC. È anche il motivo per cui nessun timestamp nomina mai un secondo intercalare: la codifica non ha una casella per uno.

Da una data a un valore epoch: shell, JavaScript e Python

Il blocco qui sopra trasforma un valore epoch in qualcosa di leggibile. La direzione opposta — una data che hai già, come testo o come insieme di numeri, trasformata in valore epoch — è dove vivono i bug di fuso orario, perché ognuno di questi assume in silenzio un fuso quando il testo non ne nomina uno. Ecco lo stesso lavoro in tre modi, sull’istante 2024-05-20T09:33:20Z di questa guida. Le righe di shell sono il date di GNU; quello di BSD e macOS accetta altre opzioni.

date -u -d '2024-05-20 09:33:20' +%s     # 1716197600 — -u legge il testo come UTC
date -d '2024-05-20 09:33:20 UTC' +%s    # lo stesso, con il fuso nominato nel testo
date -d '2024-05-20 09:33:20' +%s        # né l’uno né l’altro: il fuso della tua macchina
Date.parse('2024-05-20T09:33:20Z') / 1000    // 1716197600 — è la Z a renderlo UTC
new Date('2024-05-20T09:33:20Z').getTime()   // lo stesso istante in millisecondi
Date.parse('2024-05-20 09:33:20')            // senza Z: il fuso della tua macchina
from datetime import datetime, timezone
int(datetime(2024, 5, 20, 9, 33, 20, tzinfo=timezone.utc).timestamp())   # 1716197600 — datetime consapevole
int(datetime.fromisoformat('2024-05-20T09:33:20+00:00').timestamp())     # lo stesso, letto da una stringa
int(datetime(2024, 5, 20, 9, 33, 20).timestamp())                        # ingenuo: il fuso della tua macchina

Lo schema è identico in tutti e tre: nomina il fuso, oppure erediti quello su cui è impostata la macchina. Un numero giusto sul tuo portatile e sbagliato di ore su quello di un collega è quasi sempre questo, ed è il motivo per cui lo strumento qui sopra mostra UTC e la tua lettura locale affiancate invece di sceglierne una per te. Se il numero ce l’hai già e vuoi controllarlo a occhio, incollalo nel campo in cima a questa pagina.

Domande frequenti

Come fa a sapere se il mio numero è in secondi o millisecondi?
Dal suo ordine di grandezza: i valori sotto circa 1e11 sono letti come secondi, quelli maggiori come millisecondi. Oggi questo separa nettamente i secondi a dieci cifre dai millisecondi a tredici. L’interpretazione è mostrata accanto al risultato e puoi cambiarla con un clic, quindi la deduzione non ti viene mai nascosta.
Quale fuso orario conta come «locale»?
Quello che segnala il tuo dispositivo, rilevato nel browser e mostrato per nome così da non lasciare dubbi. È il tuo fuso, non quello del sito: chi visita da Berlino vede l’ora di Berlino e chi visita da Tokyo quella di Tokyo.
Posso riconvertire una data in timestamp?
Sì. Lo stesso campo accetta entrambe le direzioni: scrivi un numero e ottieni una data, scrivi una data come 2024-05-20 o 2024-05-20T09:33:20Z e ottieni il valore epoch. Non c’è nessuna modalità da cambiare.
Gestisce le date precedenti al 1970?
Sì. I timestamp precedenti all’epoch sono semplicemente negativi — -86400 è il 31 dicembre 1969 — e i valori negativi vengono accettati e convertiti normalmente.
Perché il mio timestamp mostra una data diversa da quella che mi aspettavo?
Quasi sempre per uno di due motivi: l’interpretazione secondi/millisecondi non è quella che davi per scontata (controlla l’etichetta e cambiala), oppure stai confrontando un valore UTC con un’aspettativa in ora locale. Lo strumento mostra entrambe le righe affiancate così vedi di quale dei due si tratta.
Che cos’è il problema dell’anno 2038?
I sistemi che memorizzano i secondi epoch in un intero a 32 bit con segno vanno in overflow il 19 gennaio 2038 e passano a un numero negativo, restituendo date nel 1901. Tutto ciò che usa valori a 64 bit — cioè quasi tutto il moderno — non è interessato, ma i sistemi embedded ereditati e le vecchie colonne di database possono ancora essere a rischio.
Perché il mio timestamp ha diciotto cifre?
Perché quasi certamente non è un timestamp Unix. I secondi Unix oggi hanno dieci cifre e i millisecondi tredici; diciotto è l’aspetto di un tick da cento nanosecondi, che è quello che Windows FILETIME conta dal 1601 e che .NET conta dall’inizio dell’anno 1. Sedici cifre sono l’altro caso frequente: lo stesso istante in microsecondi. La sezione sugli epoch qui sopra dà la costante da sottrarre in ciascun caso.
Come converto una data in timestamp Unix in Python?
Costruisci un datetime consapevole del fuso — uno che porti un tzinfo — chiama il suo metodo timestamp e tronca il risultato a intero. Il blocco di codice qui sopra contiene la riga, e la stessa sezione mostra lo stesso lavoro nella shell e in JavaScript. Tutta la difficoltà sta nel tzinfo: se lo ometti, Python legge i tuoi numeri come ora locale della macchina e restituisce un valore diverso senza dirtelo.
Il timestamp che inserisco viene inviato da qualche parte?
No. Analisi, conversione e formattazione vengono eseguite interamente nel tuo browser, appoggiandosi al supporto per date e fusi orari della piattaforma stessa. Nulla di ciò che digiti lascia il tuo dispositivo.

Strumenti correlati