← Tutti gli articoli

Errori del convertitore epoch: evitare conversioni di timestamp Unix errate

La maggior parte dei bug del convertitore epoch non è nella matematica — è nell'unità, nel fuso orario e nelle ipotesi che porti all'input. Questa è una guida pratica agli errori di conversione che producono date nel 1970 e bug sfasati di un'ora, ciascuno abbinato all'unico passo di verifica che lo individua.

I sette errori che producono una data sbagliata

Un convertitore epoch fa aritmetica semplice, quindi quando l'output è sbagliato la causa non è quasi mai la matematica — è l'input. Un timestamp non porta un'etichetta che dica se è in secondi o millisecondi, in UTC o locale, o quanto è preciso, e ogni conversione errata nasce dall'indovinare male uno di questi punti. L'indizio più rapido è l'anno risultante: una data vicina al 1970 o a migliaia di anni nel futuro è una confusione di unità, e una data corretta ma sfasata di un numero tondo di ore è un errore di fuso. La tabella sottostante è la guida pratica; le sezioni successive spiegano in dettaglio gli errori di unità e di fuso e mostrano come verificare una conversione nel codice.

ErroreCosa vediCausaCorrezione
Secondi letti come millisecondiLa data finisce nel 1970Date e Date.now() di JS si aspettano ms; hai passato secondi a 10 cifreMoltiplicare i secondi per 1000
Millisecondi letti come secondiData a migliaia di anni nel futuroValore a 13 cifre passato a una funzione in secondiDividere prima per 1000
UTC mostrato come ora localeGiorno giusto, orologio sfasato del tuo offsetIl convertitore ha scelto di default un altro fusoImpostare il convertitore su UTC
Ora locale copiata senza il suo offsetSfasata di ore su un'altra macchinaUn'ora da orologio a muro salvata senza fusoSalvare l'UTC più il fuso orario
Ora a muro ambigua (ora legale)Sfasata di esattamente un'ora vicino a un cambioUn'ora locale che si verifica due volte o maiConvertire dall'UTC; fissare il fuso IANA
Micro/nanosecondi letti come secondiData lontana nel futuro (16 o 19 cifre)Valore di database o di tracing in µs o nsDividere per 1.000.000 (µs) o 1.000.000.000 (ns)
Fidarsi della precisione mostrataParte sub-secondo scartata silenziosamenteIl convertitore ha troncato i millisecondiConfermare l'unità documentata dall'API di destinazione

Cosa fa un convertitore epoch

Un convertitore epoch trasforma i timestamp numerici in date leggibili e riconverte le date umane in timestamp epoch. Uno buono gestisce secondi Unix, millisecondi Unix, output UTC, output in fuso locale e stringhe ISO 8601, e rende evidente l'unità prima che tu copi un valore in codice, in un database o in una richiesta API. Convertitore epoch, convertitore di tempo Unix, convertitore di timestamp Unix e calcolatore di epoch Unix descrivono lo stesso lavoro: tradurre tra un conteggio di secondi (o millisecondi) dal 1° gennaio 1970 UTC e una data che un umano possa leggere. Il convertitore è raramente il problema — di solito lo è l'input.

Gli errori di unità: secondi, millisecondi, micro, nano

L'errore di conversione di gran lunga più comune è una confusione di unità, e ha una firma: la data finisce nel 1970, o a migliaia di anni. JavaScript è dove morde più spesso, perché sia il costruttore Date sia Date.now() lavorano in millisecondi mentre la maggior parte delle API, dei database e il comando Unix date lavorano in secondi. Passa un valore in secondi a 10 cifre a new Date() senza moltiplicare per 1000 e atterri 53 anni troppo presto. Al contrario — dare millisecondi a 13 cifre a una funzione in secondi — scaglia la data lontano nel futuro. Le sorgenti a precisione maggiore peggiorano le cose: i database emettono spesso microsecondi a 16 cifre e i sistemi di tracing nanosecondi a 19 cifre, ed entrambi sembrano un valore Unix valido finché non si decodificano nel millennio sbagliato.

  • 10 cifre → secondi (es. 1700000000); 13 → millisecondi; 16 → microsecondi; 19 → nanosecondi
  • JavaScript: new Date(seconds * 1000), oppure new Date(ms) direttamente
  • Microsecondi → dividere per 1.000.000 prima di convertire; nanosecondi → per 1.000.000.000
  • Verifica di buon senso: il risultato deve essere una data plausibile nel decennio attuale

Gli errori di fuso orario: UTC vs locale e ora legale

Una volta corretta l'unità, gli errori restanti sono errori di fuso, e anche loro condividono una firma: la data è corretta ma l'orologio è sfasato di un numero intero di ore. Un timestamp Unix è un singolo istante senza fuso proprio; l'offset viene applicato solo quando l'istante viene formattato. Quindi due convertitori impostati su fusi diversi mostrano orari diversi per lo stesso numero — nessuno sbaglia, mostrano semplicemente viste locali diverse. La trappola è copiare un'ora locale da orologio a muro senza annotare da quale fuso proviene, o convertire un'ora che cade su un cambio di ora legale, dove un'ora locale può verificarsi due volte o mai. Quando un risultato è sfasato di esattamente un'ora, sospetta dell'ora legale prima di sospettare del convertitore.

  • Confrontare i valori in UTC; applicare un fuso locale solo nel momento in cui li mostri
  • Non salvare mai un'ora locale senza salvare anche il suo fuso IANA o offset UTC
  • Intorno a un cambio di ora legale, derivare l'istante dall'UTC, non da un'ora locale ambigua

Scegli prima la direzione

La maggior parte delle attività con i timestamp va in una di due direzioni: da epoch a data, o da data a epoch. Decidere prima la direzione previene la causa più comune di dati di test errati e payload API rotti — convertire il valore giusto nel verso sbagliato.

  • Da epoch a data: incolla 1700000000 e leggi la data UTC o locale
  • Da data a epoch: scegli 2026-01-01 00:00:00 UTC e ottieni 1767225600
  • Conferma se la destinazione si aspetta secondi o millisecondi prima di copiare il risultato

Cosa verificare prima di copiare un valore convertito

Un convertitore può essere corretto solo quanto l'input è inequivocabile. Prima di copiare un timestamp in un test, un cron, una migrazione o una richiesta API, conferma l'unità, il fuso e la precisione attesa. La verifica di buon senso più rapida è l'anno risultante: una data vicina al 1970 o lontana nel futuro segnala quasi sempre una confusione di unità più che un errore del convertitore.

  • Il sistema ricevente si aspetta secondi o millisecondi?
  • La data mostrata è in UTC o in ora locale?
  • Il timestamp rappresenta un istante o una data di calendario locale?
  • La colonna del database memorizza datetime nativo, secondi Unix o millisecondi Unix?
  • Il risultato è vicino al 1970 o lontano nel futuro, cosa che di solito segnala una confusione di unità?

Verificare una conversione nel codice

Quando un valore convertito conta — una migrazione, un confine di fatturazione, una pianificazione cron — non fidarti di un solo strumento. Ricava di nuovo lo stesso istante nel tuo runtime e verifica che i due concordino in UTC. Ognuna di queste righe stampa una stringa ISO 8601 inequivocabile con suffisso Z, quindi non c'è alcuna congettura sul fuso locale da confrontare.

  • JavaScript: new Date(1700000000 * 1000).toISOString() // '2023-11-14T22:13:20.000Z'
  • Python: datetime.fromtimestamp(1700000000, tz=timezone.utc).isoformat()
  • Shell (GNU): date -u -d @1700000000 +'%Y-%m-%dT%H:%M:%SZ'
  • Se lo strumento e il tuo runtime non concordano, il sospetto è l'unità o il fuso dell'input — non il convertitore

Esempio pratico: un istante, tre rappresentazioni

Prendi l'istante 2026-01-01 00:00:00 UTC. Come secondi Unix è 1767225600; come millisecondi Unix è 1767225600000; come ISO 8601 è 2026-01-01T00:00:00Z. Tutti e tre descrivono lo stesso momento — cambiano solo formato e unità. L'istante non porta mai un fuso proprio; New York mostrerebbe lo stesso valore come 2025-12-31 19:00:00, perché l'offset viene applicato al momento della visualizzazione, non memorizzato nel numero.

Articoli correlati

FAQ

Perché la mia data convertita finisce nel 1970?
Quasi sempre perché i secondi sono stati letti come millisecondi. Date e Date.now() di JavaScript usano i millisecondi, quindi passare un valore in secondi a 10 cifre finisce a gennaio 1970. Moltiplica prima i secondi per 1000.
Perché la mia ora convertita è sfasata di esattamente un'ora?
È un errore di fuso orario o di ora legale, non un errore di calcolo. Il convertitore ha applicato un fuso diverso, o l'ora locale è caduta su un cambio di ora legale. Imposta il convertitore su UTC per vedere l'istante canonico, poi applica il fuso che vuoi davvero.
Qual è il miglior formato del convertitore epoch da copiare?
Per il codice, copia secondi o millisecondi Unix in base a ciò che documenta l'API di destinazione. Per gli umani, copia ISO 8601 con una Z o un offset di fuso esplicito affinché l'istante sia inequivocabile.
Un convertitore epoch è la stessa cosa di un convertitore di tempo Unix?
Per la maggior parte delle ricerche degli sviluppatori, sì. Convertitore epoch, convertitore di tempo Unix, convertitore di timestamp Unix e calcolatore di epoch Unix convertono tutti tra timestamp di epoch Unix e date leggibili.
Perché i convertitori epoch mostrano orari locali diversi?
Applicano fusi diversi. L'istante UTC sottostante è identico; cambia solo la visualizzazione locale. Imposta il convertitore su UTC per confrontare il valore canonico.
Come faccio a sapere se il mio numero è in secondi o in millisecondi?
Conta le cifre. Un valore moderno a 10 cifre è in secondi Unix; uno a 13 cifre è in millisecondi Unix. Se un valore a 10 cifre finisce vicino al 1970 in JavaScript, è stato trattato come millisecondi e va moltiplicato per 1000.