Quando si lavora con file Excel in Go, spesso ci si imbatte in date rappresentate come numeri seriali. Questo è il formato interno usato da Excel per memorizzare le date: un numero intero che rappresenta i giorni trascorsi dal 1 gennaio 1900 (o 1904, a seconda della versione).
In questo articolo vedremo come convertire questi numeri in oggetti time.Time
di Go, per poterli usare e formattare facilmente.
Cos'è il formato data di Excel?
Excel rappresenta le date come numeri seriali. Ad esempio:
1
corrisponde al 1 gennaio 190044561
corrisponde al 10 luglio 2021
Tuttavia, c'è una particolarità importante: Excel considera erroneamente il 1900 come anno bisestile. Quindi, il 29 febbraio 1900 viene considerato valido (anche se non lo è). Questo introduce un errore di 1 giorno per tutte le date successive al 28 febbraio 1900.
Conversione in Go
Ecco una funzione in Go per convertire una data Excel (in formato float64) in un time.Time
corretto:
package main
import (
"fmt"
"time"
)
// ExcelEpoch è il punto di partenza: 1 gennaio 1900
var ExcelEpoch = time.Date(1899, 12, 30, 0, 0, 0, 0, time.UTC)
func excelDateToTime(serial float64) time.Time {
return ExcelEpoch.AddDate(0, 0, int(serial))
}
func main() {
excelSerial := 44561.0
t := excelDateToTime(excelSerial)
fmt.Println("Data convertita:", t.Format("2006-01-02"))
}
Note importanti
- La funzione gestisce correttamente le date Excel basate sull'epoca 1900 (standard su Windows).
- Se lavori con file generati su Mac, Excel può usare l'epoca 1904. In quel caso, modifica la base a
1904-01-01
. - I valori decimali rappresentano le frazioni di giorno (es.
0.5
= mezzogiorno). Se necessario, puoi usaretime.Duration
per gestirli.
Conclusione
Convertire le date da Excel a Go è semplice una volta compreso il sistema di numerazione di Excel. Con poche righe di codice è possibile trasformare questi numeri in date leggibili e utilizzabili nelle proprie applicazioni.