为什么Excel工作日在1900年出错?


27

这个问题是基于观察AdamV他的回答我如何获得一天的名字到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
由于这个问题,我稍微改写了我以前的答案,以明确说明1/1/1900不是星期日,但是Excel认为是星期日。这种不准确性不会改变以前的答案的实质,即使用工作日数字作为基础来产生格式化为日期格式的文本是有缺陷且不必要的。
AdamV 2012年

Answers:


40

如Microsoft KB 214058中所述

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

更多信息

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

但是,在此日期系统中,1900年被错误地解释为a年。因为在1900年没有2月29日(“ le日”),所以不能正确计算1900年3月1日之前任何日期(“ le日”之后的日期)的星期几。

“其他电子表格程序”指的是Lotus 1-2-3,当时它很流行,并且错误地认为1900年是a年。KB 214326中对此进行了更详细的说明:

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

更多信息

当Lotus 1-2-3首次发布时,该程序假定1900年是a年,即使实际上不是a年。这使程序更容易处理leap年,并且对Lotus 1-2-3中的几乎所有日期计算都没有损害。

当Microsoft Multiplan和Microsoft Excel发布时,他们还假定1900年是a年。此假设使Microsoft Multiplan和Microsoft Excel可以使用Lotus 1-2-3使用的相同序列日期系统,并提供与Lotus 1-2-3的更大兼容性。将1900年视为a年,也使用户更容易将工作表从一个程序移动到另一个程序。

尽管从技术上可能会纠正此问题,以使当前版本的Microsoft Excel不会假定1900年是a年,但这样做的弊大于利。

如果要纠正此行为,则会出现许多问题,包括以下问题:

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

如果行为仍然未纠正,则只会发生一个问题:

  • WEEKDAY函数为1900年3月1日之前的日期返回错误的值。因为大多数用户不使用1900年3月1日之前的日期,所以此问题很少发生。

10
这是Stack Exchange自己的Joel Spolsky的相关故事:joelonsoftware.com/items/2006/06/16.html
matt

5
另请参阅。许多程序员错误地认为使用日期/时间很容易:)
BlueRaja-Danny Pflughoeft 2012年

3
历史nitpicK:当您说1-2-3是“非常受欢迎”时,您的意思是它曾经是主要的电子表格。
艾萨克·拉比诺维奇

12

这是乔尔本人解释的原因:我的第一个BillG评论

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

??

我去找一个Excel开发人员,他的年龄足以记住其原因。埃德·弗里斯(Ed Fries)似乎知道答案。

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

“是59岁,”我说。

“现在尝试3月1日。”

“是61岁!”

“ 60出什么事了?” 埃德问。

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

“好猜,但没有雪茄,”埃德说,让我想了一会儿。

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

1900年不是a年。

“这是Excel中的错误!” 我大叫。

“恩,不是真的,”埃德说。“我们必须那样做,因为我们需要能够导入Lotus 123工作表。”

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

“是的,但是可能是有意的一年。Lotus必须容纳640K。这不是很多内存。如果您忽略1900,则可以通过查看最右边的两位来确定给定的年份是否是a年。为零,这确实是快速而又容易的事,Lotus伙计们可能认为过去两个月来的错误并不重要。


1
@JeroenWiertPluimers:实际上,我对此链接的答案已被主持人删除,我决定扩大答案。
Giorgi

2

一种解决方案是将一年增加400年,按照以下公式= WEEKDAY(DATE(A4 + 400,B4,C4),1)计算工作日,因此,如果A4 = 1834 B4 = 12 C4 = 14这将返回1(星期日),与2234年12月14日相同。这会在更改公历后一年的1753年之前的日期停止工作

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.