将Excel数字日期时间转换为time.Time

3
在 Golang 中解析 Excel 文件时,日期时间列被读取为 44531.553587963,实际上代表时间 2021年12月01日13时17分10秒。如何将这个十进制表示转换为Go中的time.Time对象?
1个回答

4
var in float64 = 44531.553587963
excelEpoch := time.Date(1899, 12, 30, 0, 0, 0, 0, time.UTC)
tm := excelEpoch.Add(time.Duration(in * float64(24 * time.Hour)))
fmt.Println(tm) // 2021-12-01 13:17:10.000003072 +0000 UTC

Excel中的时间(通常情况下,除了一些奇怪的旧版格式)通常是自1899年12月30日以来的天数。它本应该使1.0等于1900-01-01午夜,但由于有人使用了一个错误的闰年算法,认为1900年2月有29天,实际上只有28天,所以自那时起的所有日期都偏移了1天。为了不破坏现有的电子表格,他们保留了这个bug,因此要获取正确的日期(1900年后),您必须将时期向前偏移一天,因此1.0等于1989-12-31,0.0等于1989-12-30。

无论如何,一旦我们知道纪元,只需要进行一些类型转换,将一天的纳秒转换为浮点数,乘以天数,然后将其转换回持续时间,并将其添加到纪元中即可。


1
一个关于编程话题的小故事:Joel Spolsky的博客文章 - FObersteiner
2
另一种方法是将其转换为Unix时间戳:tm:= time.Unix(int64((in - 25569) * 86400), 0) - blami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接