Quando si lavora con file Excel, è comune imbattersi in date rappresentate come numeri interi. Excel utilizza un sistema basato su numeri seriali per rappresentare le date: il numero 1
corrisponde al 1 gennaio 1900. Per convertire queste date in un formato leggibile in JavaScript, è necessario effettuare una trasformazione basata su questa logica.
Il Problema
Ad esempio, il numero 45000
rappresenta una data nel 2023. Tuttavia, in JavaScript, non possiamo semplicemente trattare questo numero come una data. Dobbiamo convertirlo partendo da una base temporale (epoch) e aggiungere il numero di giorni corrispondente.
La Soluzione in JavaScript
Il codice seguente mostra come convertire una data Excel (numero seriale) in una data JavaScript leggibile:
function excelDateToJSDate(serial) {
// Excel considera il 1 gennaio 1900 come giorno 1
// JavaScript usa il 1 gennaio 1970 come epoch
// Calcoliamo la differenza in millisecondi e creiamo una nuova data
const excelEpoch = new Date(1899, 11, 30); // 30 dicembre 1899, non 1 gennaio 1900, per compensare il bug di Excel sul 1900 bisestile
const msPerDay = 24 * 60 * 60 * 1000;
return new Date(excelEpoch.getTime() + serial * msPerDay);
}
Esempio di utilizzo:
const excelSerial = 45000;
const jsDate = excelDateToJSDate(excelSerial);
console.log(jsDate.toISOString()); // Output: ad esempio, "2023-03-06T00:00:00.000Z"
Considerazioni Importanti
- Excel su Windows considera erroneamente il 1900 come anno bisestile, quindi il numero seriale
60
rappresenta il 29 febbraio 1900, una data inesistente. Questo è compensato nel calcolo usando il 30 dicembre 1899 come base. - Excel su macOS può invece usare come base il 1 gennaio 1904 (sistema "1904 date system"), quindi è importante conoscere il contesto del file Excel per fare la conversione corretta.
Conclusione
Convertire le date da formato Excel a formato standard in JavaScript richiede una semplice trasformazione basata su una data di riferimento. Con pochi passaggi è possibile ottenere date leggibili e correttamente gestibili nel proprio codice JavaScript.