You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:45:04