众所周知,excel中的日期实际上是以数字的方式存储的。
比如:1900-1-1对应数字1,1900-1-2对应数字2,以此类推。
很简单吧?!
但如果你用这样的逻辑来计算日期时,会发现计算出来的日期和 excel 中不一样。
比如45106在excel中为2023-6-29,而计算结果却是2023-6-30,尝试了用其他语言进行计算,结果都是2023-6-30。
相同数字的情况下excel显示的日期和计算结果不一致,有一个必定是错误的,于是乎从头开始试吧!!
从1开始算,到了60就发现日期不一样了,excel中60对应1900-2-29,而计算结果是1900-3-1。
再试下59,两者结果是一样的,那么问题就出在60上了。
再仔细看下——excel中是2月29号,掐指一算,1990年不是闰年,没有29号才对,看来是excel错了。
为再更加确信是exel的错,于是请教了GPT大神。
果然,微软也知道这个bug,但微软表示“我就是不改”。
其实保留这个bug也是出于无奈,在excel问世前,电子表格的鼻祖之一 Lotus-1-2-3 已存在这个问题,为了兼容Lotus,微软只能保留这个bug,以防止打开以往的工作表时日期出现错误,后来就一直以“错误的数字,正确的显示”的方式继续错下去。
平常我们不用去关心日期背后的数字是否正确,只需要显示是正确就行了。对于程序员来说,大多数情况也是直接读取出日期,但如果你是先读取数字再换算成日期(比如手写代码来解析xlsx),就要注意了,xml文件中代表日期的数字在1900-2-28之后需要减1。