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:
- 1corrisponde al 1 gennaio 1900
- 44561corrisponde 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.Durationper 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.