Edited at

Excelの日付のFloat値


Excelで日時を標準にしたらFloat値が出てくる。

image.png

このFloat値はどういう値なのか?


整数部は日付

1990年1月0日からの経過日数。1990年1月1日だと1になる。

ただし1990年2月29日という存在しない日付もカウントしてる。

なので2018年11月8日は43412日経過している。


小数部は時刻

セルの時刻部(14:51)を秒数にしたものを24h x 60min x 60sec => 86400secで割ったもの。

14:51:00 = 14 * (60 * 60) + 51 * 60 = 53460

53460 / 86400 = 0.61875 (最初のスクショの小数部に一致!)


Floatから日時を復元する

ExcelをGoで読みとる際に日付変換したかったので、以下の様に解決しました。

func convertExcelDateFloat(excelDateFloat float64, dateFormat string) string {

pastDay := int(excelDateFloat)
pastSec := excelDateFloat - float64(pastDay)
date := time.Date(1900, 1, 1, 0, 0, 0, 0, time.Local)

// Excelでは 1990/1/0 を開始基準として経過日数を整数部で数えている。つまり1990/1/1は1日経過している。
// 加えて存在しない 1990/2/29 も経過日数に含まれているので-2日を差し引いた経過日数を足す
date = date.Add(time.Duration(pastDay-2) * time.Hour * 24)

// 小数部は時刻部を秒変換したのものを24時間秒(24h * 60m * 60s = 86400s)で割ったものとなっている
// なので"小数部 * 86400 = 経過秒"に復元したものを足す
date = date.Add(time.Duration(pastSec*86400) * time.Second)
return date.Format(dateFormat)
}