Nanosecondi in data
Converti i nanosecondi in una data leggibile. Inserisci il timestamp in nanosecondi (es. 1704067200000000000).
Una marca temporale in nanosecondi perde in silenzio le ultime tre cifre dentro un numero JavaScript
I numeri di JavaScript tengono gli interi in modo esatto solo fino a 2⁵³ − 1. Una marca temporale attuale in nanosecondi vale circa 1,77 × 10¹⁸, cioè 196 volte quel limite. Passane una e 1770000000123456789 torna indietro come 1770000000123456800: nessun errore, nessun avviso, semplicemente tre cifre sostituite in silenzio.
Come funziona
- Converte marche temporali in nanosecondi in date e viceversa, mantenendo la parte inferiore al millisecondo.
- Segnala il limite di precisione, perché questo guasto è silenzioso e non rumoroso.
- Gestisce la conversione in millisecondi che la maggior parte delle librerie di date richiede in ingresso.
nanosecondi ÷ 1.000.000 = millisecondi nanosecondi ÷ 1.000.000.000 = secondi MAX_SAFE_INTEGER = 9.007.199.254.740.991 (2⁵³ − 1) in nanosecondi l'intero intervallo copre solo circa 104 giorni in millisecondi copre circa 285.000 anni
Esempio pratico
Quanto copre ciascuna unità di tempo dentro l'intervallo degli interi sicuri e cosa accade superandolo.
- millisecondi: 2⁵³ copre circa 285.000 anni
- microsecondi: circa 285 anni
- nanosecondi: circa 0,285 anni, all'incirca 104 giorni
- 1770000000123456789 assegnato a un numero
- viene riletto come 1770000000123456800
Le ultime tre cifre sono cambiate e nulla l'ha segnalato. Una marca temporale in nanosecondi richiede BigInt o una stringa; tenerla in un numero ordinario non è un fastidio di arrotondamento ma la garanzia che qualsiasi dettaglio sotto il microsecondo sia finzione.
Come leggere il risultato
- Usa BigInt per l'aritmetica in nanosecondi e converti in numero solo dopo aver diviso fino ai millisecondi. La divisione deve avvenire nello spazio BigInt: convertire prima e dividere dopo ha già distrutto le cifre che volevi conservare.
- Database e formati di trasporto trasportano spesso i nanosecondi come stringhe esattamente per questo. Convertire una simile stringa in virgola mobile per «ripulirla» è il modo più comune di perdere la precisione, e accade nello strato che nessuno ispeziona.
- L'oggetto Date di JavaScript è esso stesso basato sui millisecondi e non può affatto rappresentare tempi più fini. Convertire nanosecondi in un Date scarta il resto per costruzione, quindi lì la perdita è attesa e non un bug: la sorpresa è solo quando avviene in silenzio durante un calcolo.
- La precisione al nanosecondo è raramente il requisito reale. Ordinamento dei log, tracciamento e profilazione richiedono di norma un ordine monotono più che un'accuratezza assoluta al nanosecondo, e un orologio monotono lo fornisce senza il problema di rappresentazione.
Domande frequenti
- Perché la mia marca temporale è cambiata di qualche centinaio di nanosecondi?
- È stata riposta in un numero in virgola mobile che non è in grado di rappresentarla. Oltre 2⁵³ − 1 gli interi vengono arrotondati al valore rappresentabile più vicino, quindi 1770000000123456789 diventa 1770000000123456800. Nulla solleva un errore perché è comportamento definito, non un difetto.
- Come vanno conservate le marche temporali in nanosecondi?
- Come BigInt in JavaScript, come intero a 64 bit nella maggior parte degli altri linguaggi, oppure come stringa quando si attraversa un confine come JSON. Converti in numero solo dopo aver diviso fino ai millisecondi e quando le cifre in più non servono più.