Excel日期的一个惊天大Bug
- 2026-09-20 04:41:04
Excel日期的一个惊天大Bug如果你在Excel中输入一个日期,比如2026-01-31,然后把单元格格式改为数字,那么这个日期就会变成46053。在大多数编程环境中,日期是以实数存储的,它储存的是自过去某个约定的日期以来的天数。在Excel中, 这个约定的日期是1900-01-01,所以Excel在保存2026-01-31这一信息时,实际上保存的是1900-01-01到2026-01-31之间的天数,也即46053。 
一个很简单的验证方法,你可以在Excel中输入1900-01-01,然后把单元格格式改为数字,就会发现1900-01-01是1,1900-01-02是2。。。 如果继续把日期往下填充,你就会发现Excel中居然有1900-02-29这一日期。而根据闰年的判定规则: 1900不能被400整除,它不是闰年,所以没有2月29日。1900年的2月只有28天。 
Excel中为什么会有一个这么明显的Bug,且一直延续至今呢?其实微软的工程师不是不知道这一错误的存在,而是为了兼顾市场,故意引入了这一错误: 在Excel出道前,占据市场统治地位的电子表格软件是 Lotus 1-2-3。Lotus 的开发者为了节省内存空间,简化了闰年判断算法(只看能否被4整除),错误地把1900年当成了闰年。微软为了抢占Lotus 1-2-3 的用户,让他们能无缝迁移(保持日期计算逻辑一致),不得不模仿了这个错误。这个错误已经使用了几十年,修复它会导致历史上数以亿计的工作表日期计算全部乱套。 Excel的时任项目经理Joel Spolsky曾经直接向比尔·盖茨汇报过这一问题,他多年后在博客中回忆了这有趣的一幕: 1992 年 6 月 30 日。比尔·盖茨的审查会。 那时候,微软的官僚气息还没那么重。不像今天有 11 或 12 层管理架构。 整个汇报链条的人都到齐了,还有他们的七大姑八大姨(随行人员),以及我团队里的一个人,他在会上的全部工作就是精确统计比尔说了多少次“F”开头的那个脏话。F-count 越低,说明会议越成功。 比尔进来了。 我在想,他居然也有两条腿、两条胳膊、一个脑袋等等,看起来和普通人简直一模一样,这真奇妙。他手里拿着我的规格说明书(spec)。 他坐下来,和一位我不认识的高管交换了一些俏皮话,我完全听不懂,但有几个人笑了。 比尔转向我。 我注意到我的 spec 边距上有批注。他读了第一页! 他读了我的 spec 的第一页,还在边距上写了小笔记! 考虑到我们大约 24 小时前才把 spec 交给他,他一定是昨晚读的。 他开始提问。我一一作答。问题挺简单的,但我死活记不住具体问了什么,因为我无法移开视线——我注意到他在翻阅那份 spec…… 他居然读完了全篇![天哪,太激动了!] 问题变得越来越难,也越来越细节。 这些问题看起来有点随机。这时候我已经习惯把比尔当成哥们了。他是个好人!他读了我的 spec!他可能只是想问我几个关于边距批注的问题!我会给他的每个批注在 Bug 追踪系统里开一个条目,确保立马解决! 最后,那个致命的问题来了。 “我不确定,伙计们,”比尔说,“真的有人在深入研究这些细节吗?比如,所有那些日期和时间函数。Excel 有那么多日期时间函数。Basic 会有相同的函数吗?它们的工作方式会完全一样吗?” “是的,”我说,“除了 1900 年的 1 月和 2 月。” 全场死寂。 记录脏话次数的人和我的老板交换了一个惊讶的眼神。我是怎么知道那个的?1900 年的 1 月和 2 月怎么了? “好吧。干得不错,” 比尔说。他拿走了那份写满批注的 spec 副本…… ……然后离开了。 “四次,”记录员宣布,“哇,这是我记得的最低纪录了。比尔上了年纪,变得平和了。” 后来有人向我解释道:“比尔其实并不想审查你的 spec,他只是想确保你一切尽在掌握。他的标准套路是问越来越难的问题,直到你承认自己不知道,然后他就可以痛骂你准备不足。没人知道如果你答出了他能想到的最难的问题会发生什么,因为以前从未发生过。” 比尔·盖茨的技术能力惊人。他理解 Variant 变量、COM 对象、IDispatch,理解为什么自动化(Automation)与虚函数表(vtables)不同,以及为什么这可能导致双重接口(dual interfaces)。他连日期函数都操心。如果他信任干活的人,他就不会插手软件开发;但你一分钟也别想忽悠他,因为他是个程序员。一个真正的、实实在在的程序员。 我在 1994 年离开了公司,原以为比尔已经彻底忘了我,直到我看到比尔·盖茨的一个简短采访。他在采访中顺带提到,招聘一个优秀的 Excel 项目经理(Program Manager)是多么困难。他说,这种人不是从树上长出来的,大概是这个意思。他指的会是我吗?不,大概是别人吧。不过,谁知道呢。

能被4整除的年份通常是闰年。 如果是整百年(如1900),还必须能被400整除。

本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。