JavaScript Date.now(): ottenere e convertire timestamp Unix

Una guida incentrata su JavaScript Date.now(): ottieni il timestamp Unix attuale, converti secondi contro millisecondi, trasforma i timestamp in oggetti Date, formatta con Intl ed evita le trappole comuni del parsing.

Come JavaScript memorizza il tempo internamente

Ogni Date di JavaScript è internamente un singolo float a 64 bit che rappresenta i millisecondi dall'epoch Unix (1° gennaio 1970 00:00:00 UTC). Questo numero è ciò che restituiscono Date.getTime() e Date.now(). Nessun fuso è memorizzato dentro un Date — è sempre un conteggio di millisecondi UTC. Le informazioni sul fuso contano solo quando formatti la data per la visualizzazione, ed è per questo che lo stesso oggetto Date può apparire come lunedì sera a Los Angeles e martedì mattina a Tokyo. Questo articolo si concentra su Date.now() e sulla conversione dei timestamp; per una panoramica più ampia di ogni attività con i timestamp in JavaScript, vedi la guida di riferimento completa collegata sotto.

Ottenere il timestamp Unix attuale

Usa Date.now() per i millisecondi e Math.floor(Date.now() / 1000) per i secondi. Entrambi sono ampiamente supportati e non richiedono import. L'abitudine di denominazione importante è includere l'unità nel nome della variabile: createdAtMs, expiresAtSeconds o unixSeconds. I nomi con unità impediscono a un futuro consumatore dell'API di indovinare cosa significa un campo timestamp nudo.

  • Date.now() → 1700000000000 (milliseconds, 13 digits)
  • Math.floor(Date.now() / 1000) → 1700000000 (seconds, 10 digits)
  • +new Date() → same as Date.now() via unary coercion
  • new Date().getTime() → same result, slightly more verbose

Date.now() vs performance.now()

Date.now() serve per i timestamp dell'orologio: log, payload API, campi di database, scadenza della cache e tutto ciò che deve allinearsi al tempo di calendario reale. performance.now() serve a misurare la durata trascorsa all'interno della pagina o del processo corrente. È monotono e ad alta precisione, ma non è un timestamp Unix e non può essere convertito in una data reale senza un punto di riferimento aggiuntivo.

  • Usa Date.now() quando il valore verrà memorizzato, inviato a un'API o mostrato come data
  • Usa performance.now() per misurare quanto sono durati il rendering, il parsing o una richiesta
  • Non memorizzare performance.now() in un database come tempo di evento
  • Non sottrarre due valori di Date.now() per la temporizzazione sensibile alla sicurezza; i cambi dell'orologio di sistema possono influenzarli

Convertire un timestamp in un Date

Il costruttore Date accetta millisecondi. Se il tuo timestamp è in secondi (10 cifre), moltiplica per 1000 prima di passarlo. Dimenticarlo è l'errore di timestamp più comune in JavaScript. Un controllo rapido è il numero di cifre: i secondi Unix attuali hanno 10 cifre, i millisecondi Unix attuali ne hanno 13, e una chiamata al costruttore Date dovrebbe ricevere la forma a 13 cifre in millisecondi.

  • new Date(1700000000 * 1000) → Tue Nov 14 2023 22:13:20 UTC ✓ correct
  • new Date(1700000000) → Tue Jan 20 1970 16:13:20 UTC ✗ missing × 1000
  • new Date(1700000000 * 1000).toISOString() → '2023-11-14T22:13:20.000Z'
  • new Date(1700000000 * 1000).toUTCString() → 'Tue, 14 Nov 2023 22:13:20 GMT'

Formattazione consapevole del fuso con Intl

Usa Intl.DateTimeFormat per un output consapevole di locale e fuso. Gestisce l'ora legale automaticamente e non richiede librerie esterne. È la via integrata più sicura per dashboard, strumenti di amministrazione, pagine di stato e timestamp rivolti all'utente, perché ti permette di scegliere esplicitamente sia il locale sia il fuso IANA.

  • new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', dateStyle: 'full', timeStyle: 'long' }).format(date)
  • date.toLocaleString('en-GB', { timeZone: 'Europe/London', hour12: false })
  • date.toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })
  • new Intl.DateTimeFormat('en-CA', { timeZone: tz }).formatToParts(date) → array of {type, value} for custom layouts

Parsare stringhe di data in sicurezza

Il parsing è dove JavaScript diventa sorprendente. Le stringhe ISO con una Z o un offset esplicito sono sicure perché identificano un istante esatto. Le date nude e le stringhe informali sono più facili da leggere, ma spesso dipendono dalle regole del browser o dal fuso del runtime. Per i contratti API, preferisci stringhe ISO 8601 con fuso o timestamp Unix numerici con l'unità scritta nel nome del campo.

  • Safe: new Date('2026-05-19T14:30:00Z') — explicit UTC
  • Safe: new Date('2026-05-19T10:30:00-04:00') — explicit offset
  • Risky: new Date('05/19/2026') — locale-dependent and ambiguous
  • Risky: new Date('2026-05-19 10:30') — not a strict ISO timestamp in all runtimes

Errori comuni di timestamp in JavaScript

  • new Date(1700000000) invece di new Date(1700000000 * 1000) — cade nel 1970, non nel 2023
  • getMonth() restituisce 0–11, non 1–12 — usa sempre date.getMonth() + 1 nella visualizzazione
  • new Date('2024-01-01') viene parsato come mezzanotte UTC; new Date('2024/01/01') come mezzanotte locale
  • Sommare 86400000 ms per «domani» si rompe alle transizioni dell'ora legale — usa setDate(d.getDate() + 1)
  • Confrontare oggetti Date con === fallisce sempre — confronta invece i loro valori .getTime()

Checklist consigliata dei timestamp in JavaScript

Il pattern di produzione più semplice è memorizzare un singolo istante canonico e formattarlo solo al bordo. Mantieni i timestamp in UTC, includi le unità nei nomi e converti in un fuso leggibile solo nella UI o nel livello di reporting.

  • Usa i millisecondi Unix per lo stato solo-browser e la costruzione di Date in JavaScript
  • Usa i secondi Unix quando chiami API che documentano il tempo Unix in secondi
  • Usa ISO 8601 con Z o un offset esplicito quando delle persone possono ispezionare i payload
  • Usa Intl.DateTimeFormat con un timeZone esplicito per la visualizzazione
  • Aggiungi test intorno ai confini dell'ora legale quando contano le date di calendario locali

FAQ sui timestamp in JavaScript

Date.now() restituisce secondi o millisecondi?
Date.now() restituisce millisecondi dal 1° gennaio 1970 00:00:00 UTC. Dividi per 1000 e usa Math.floor() quando un'API si aspetta secondi Unix.
Perché new Date(1700000000) mostra il 1970?
Il costruttore Date si aspetta millisecondi. 1700000000 è un timestamp in secondi, quindi JavaScript lo legge come solo 1,7 miliardi di millisecondi dopo l'epoch. Usa new Date(1700000000 * 1000).
Un Date di JavaScript memorizza un fuso?
No. Un Date memorizza un conteggio di millisecondi UTC. Il fuso si applica solo nella formattazione con metodi come toString(), toLocaleString() o Intl.DateTimeFormat.
Come converto un timestamp Unix in un Date di JavaScript?
Passa millisecondi al costruttore: new Date(seconds * 1000) per un valore di secondi a 10 cifre, o new Date(ms) per un valore di millisecondi a 13 cifre. Dimenticare il × 1000 è il motivo per cui un timestamp del 2023 può apparire come 1970.