Excel 两种奇葩的日期系统
该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2022/10/25/stupid-excel-datetime-schema/
之前我开发过一个将 Excel 文件和 JSON 文件互转的命令行工具,而前几天有个同事跟我反馈了一个奇怪的现象,说是转换到 JSON 以后, 日期是错误的。一开始我没细究,后面他继续跟进,发现用Excel (最新版)打开这个xlsx文件,其中一格显示为一个日期(无公式)。 如果把它复制到另一个 Excel 文件里,它就变成了另一个日期;而如果复制到同一个文件的另一个 Sheet 里,它就还是这个日期……😐
而今天,我想起了这个问题,找到当时的文件,复现了上述现象。Google 了一下,发现这个问题的原因是 Excel 有两种日期系统:
-
1900 年日期系统:Lotus 1-2-3/MS-DOS/Windows 系统下,Excel 的默认时间系统,将 1900 年 1 月 1 日作为第一天。
-
1904 年日期系统:Excel 为了兼容 Macintosh,将 1904 年 1 月 1 日作为第一天,因为垃圾苹果的 Macintosh 系统不支持 1904-01-01 之前的日期。
还有一个原因是,Excel 错误地把 1900 年当作闰年,因此 1900 年 2 月 29 日是有效的日期,这个错误一直保留到了今天,因为微软担心修复这个错误会导致现有的 Excel 文件出现问题。
具体可以查看微软的官方文档。
可以解开这个有问题的 Excel 文件,里面对日期系统的编码如下:
1<workbookPr date1904="1" defaultThemeVersion="166925"/>
将 date1904 设置为 0,问题即可解决……
当然如果使用 Excel 2016 以上版本,则在菜单“文件-选项-高级”里把“使用1904日期系统”关闭即可。