如何计算Excel 1900日期系统对应天数?基于Golang实现相关功能
Excel 1900日期序列号Golang实现方案
这个需求非常常见,大量做Excel数据交互的开发者都处理过同类逻辑,核心要注意Excel日期系统的历史遗留bug,不然计算结果会和Excel实际输出差1天。
核心规则说明:
- Excel默认使用1900日期系统,序列号1对应1900年1月1日,数值为对应日期距离1900年1月1日的天数+1
- 为了兼容老版本Lotus 1-2-3,Excel错误将1900年识别为闰年,存在不存在的日期1900年2月29日,对应序列号60,所有1900年3月1日及之后的日期计算都要多补1天匹配这个bug
Golang核心实现代码:
package exceldate import "time" // DateToExcelSerial 输入标准time.Time类型,输出Excel 1900日期系统对应的整数值 func DateToExcelSerial(inputDate time.Time) int { // 设定1900日期系统基准日 epoch := time.Date(1900, 1, 1, 0, 0, 0, 0, time.UTC) // 计算基准日到输入日期的天数差,加1得到初始序列号 diffDays := int(inputDate.Sub(epoch).Hours() / 24) + 1 // 1900年3月1日及之后的日期补1天,兼容1900闰年bug if inputDate.After(time.Date(1900, 2, 28, 23, 59, 59, 0, time.UTC)) { diffDays += 1 } return diffDays }
测试验证:调用DateToExcelSerial(time.Date(2021, 11, 3, 0, 0, 0, 0, time.UTC))得到的输出结果就是44535,和Excel的转换结果完全一致。
补充说明:
- 如果需要支持带时间的序列号,只需要把返回值改成float64,加上
float64(inputDate.Hour()*3600 + inputDate.Minute()*60 + inputDate.Second())/86400的小数部分即可 - 少数场景如果要适配苹果端旧版Excel的1904日期系统,把基准日改成1904年1月1日,去掉闰年bug补1的逻辑即可,该场景使用占比极低,默认不需要适配
内容的提问来源于stack exchange,提问作者viniciuswebdev
相关产品推荐
相关产品推荐

