xlsx时间格式为浮点golang读取并正常格式化的方法
遇到的问题:golang读取xlsx的时间发现初始化失败,得到0000-00-00 00:00:00的结果。
xlsx里面看到的时间是这样的: 2020-11-04 16:11:38, 保存在row[0]
所以使用了 xlsxDate, _ = time.Parse(“2006-01-02 15:04:05”, row[0])
结果格式化失败
打开xlsx文件点击row[0]上去是2021/11/4 4:11:38 PM
打印日志实际读到原始的row[0]是44139.6747569444
44139.6747569444这究竟是个啥
查了资料,44139是懂1900-01-01之后运行的天数数,0.6747569444 也是天数,只不过是大半天,0.5就是12小时 这样
那这就可以运算了
给出测试函数过程
tDate1900, _ := time.Parse("2006/1/2", "1900/1/1")
// 因为不知道什么原因会多2天,所以扣掉2天才能得到正确结果,如果谁知道怎么回事可以告诉我下
prevMonth := tDate1900.AddDate(0, 0, 44139-2)
fmt.Printf("算到今天是哪一天 %v \n", prevMonth)
fmt.Printf("时间戳转换为秒的结果 %v \n", prevMonth.Unix())
// -28800是因为prevMonth.Unix()会多8小时,需要扣除掉,原因不清楚
tm := time.Unix(prevMonth.Unix()+int64(math.Floor(0.6747569444*24*60*60))-28800, 0)
fmt.Println(tm)
最终tm可以得到正确的结果2020-11-04 16:11:38,咱们可以把这个改成一个函数
func GetXlsxTimeValues(xlsxTime string) (localTime time.Time) {
ledgerDate1900, _ := time.Parse("2006/1/2", "1900/1/1")
fTime, _ := strconv.ParseFloat(xlsxTime, 64)
nTime := int(math.Floor(fTime))
prevMonth := ledgerDate1900.AddDate(0, 0, int(math.Floor(fTime))-2)
localTime = time.Unix(prevMonth.Unix()+int64(math.Floor((fTime-float64(nTime))*86400))-28800, 0)
return
}
吼吼吼,还没有查到中文的解决这个问题的文章,怕不是我是第一个