Convertire date dal formato Excel a quello standard in Go

Quando si lavora con file Excel in Go, spesso ci si imbatte in date rappresentate come numeri seriali.

Go di Gabriele Romanato

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 1900
  • 44561 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 usare time.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.