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. 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.

Torna su