为什么 Excel 中的 1900 年星期几不正确?

为什么 Excel 中的 1900 年星期几不正确?

这个问题基于以下观察亚当V他的回答如何将星期名称输入到 Excel 单元格中?

当 A1 的值为 2009-08-01 时,则:

  • =WEEKDAY(A1)将获得7
  • =TEXT(7, "dddd")将获得Saturday
  • =TEXT(7,"dddd, yyyy-mm-dd")将获得Saturday, 1900-01-07
  • =TEXT(1,"dddd, yyyy-mm-dd")将获得Sunday, 1900-01-01
  • =TEXT("1900-01-01","dddd, yyyy-mm-dd")还将获得Sunday, 1900-01-01

最后两个是错误的:1900 年 1 月 1 日实际上是星期一。
各种来源似乎都证实了这一点:

我遗漏了什么?Excel 为何会出错?

答案1

正如微软所述知识库 214058

Excel 中 1900 年 3 月 1 日之前的星期几不正确

更多信息

当最初创建 Microsoft Excel 中的日期系统时,它被设计为与其他电子表格程序使用的日期系统完全兼容。

但是,在这个日期系统中,1900 年被错误地解释为闰年。因为 1900 年没有 2 月 29 日(“闰日”),所以 1900 年 3 月 1 日(“闰日”后的第二天)之前的任何日期的星期几都无法正确计算。

“其他电子表格程序”是指莲花 1-2-3,这在当时非常流行,并且错误地认为 1900 年是闰年。这在知识库 214326

Excel 2000 错误地认为 1900 年是闰年

更多信息

Lotus 1-2-3 首次发布时,程序假设 1900 年是闰年,尽管实际上那一年并不是闰年。这使得程序更容易处理闰年,并且不会对 Lotus 1-2-3 中的几乎所有日期计算造成影响。

Microsoft Multiplan 和 Microsoft Excel 发布时也假设 1900 年是闰年。这一假设允许 Microsoft Multiplan 和 Microsoft Excel 使用与 Lotus 1-2-3 相同的序列日期系统,并提供与 Lotus 1-2-3 的更高兼容性。将 1900 年视为闰年也使用户能够更轻松地将工作表从一个程序移动到另一个程序。

尽管从技术上来说可以纠正这种行为,使得当前版本的 Microsoft Excel 不会认为 1900 年是闰年,但这样做的弊端大于优点。

如果要纠正这种行为,将会出现许多问题,其中包括:

  • 当前 Microsoft Excel 工作表和其他文档中的几乎所有日期都会减少一天。纠正这种变化需要花费大量时间和精力,尤其是在使用日期的公式中。
  • 某些函数(例如 WEEKDAY 函数)会返回不同的值;这可能会导致工作表中的公式无法正常工作。
  • 纠正此行为会破坏 Microsoft Excel 与其他使用日期的程序之间的序列日期兼容性。

如果这种行为得不到纠正,只会出现一个问题:

  • WEEKDAY 函数对于 1900 年 3 月 1 日之前的日期返回不正确的值。因为大多数用户不使用 1900 年 3 月 1 日之前的日期,所以这种问题很少见。

答案2

以下是 Joel 本人解释的原因:我的第一篇 BillG 评论

Basic 使用 1899 年 12 月 31 日作为纪元,而不是 1900 年 1 月 1 日,但由于某种原因,Excel 中的今天的日期与 Basic 中的相同。

嗯?

我去找了一位年纪足够大、记得原因的 Excel 开发人员。Ed Fries 似乎知道答案。

“哦,”他告诉我,“查看日期是 1900 年 2 月 28 日。”

“是59。”我说。

“现在试试三月一日。”

“61!”

“60怎么了?”艾德问道。

“2 月 29 日。1900 年是闰年!它可以被 4 整除!”

“猜得不错,但没成功,”埃德说,这让我疑惑了一会儿。

哎呀。我做了一些研究。能被 100 整除的年份不是闰年,除非它们也能被 400 整除。

1900 年不是闰年。

“这是 Excel 中的一个错误!”我惊呼道。

“其实不然,”艾德说。“我们不得不这么做,因为我们需要能够导入 Lotus 123 工作表。”

“那么,这是 Lotus 123 中的一个错误?”

“是的,但可能是故意的。Lotus 必须装进 640K。这不是很多内存。如果忽略 1900 年,你可以通过查看最右边两位是否为零来判断某一年是否是闰年。这真的又快又容易。Lotus 的人可能认为过去那两个月出错也没关系。

答案3

解决此问题的一种方法是在年份上加上 400 年,以计算出星期几,公式如下:

=WEEKDAY(DATE(A4+400,B4,C4),1)

因此以下变量

A4 = 1834
B4 = 12
C4 = 14

将返回1(星期日),与 2234 年 12 月 14 日相同。这对于公历变更后的一年
之前的日期将不再起作用。1753

相关内容