我尝试使用函数在 Excel 中获取今天的日期作为数字。例如,当我写这道题时,我应该得到 $18$。
我尝试使用:
TODAY()
以日期格式返回今天日期的函数。Day(<date>)
返回 的天数<date>
。也就是说DAY(19/05/1984)
应该返回 19。
因此,公式
=DAY(TODAY())
应该会给出我想要的结果。
但是,这将返回 18/01/1900(今天使用该函数时)
如果我使用
=TODAY()
在单元格 A1 中,然后
=DAY(A1)
在另一个单元格中,我获得了正确的结果。
为什么 DAY(TODAY()) 没有给出预期的结果?
从我的数学家和业余程序员(使用 Maple、Java 和一些 Python)的背景来看,我的函数组合似乎很好。
更一般地说,Excel 如何处理公式的组合?
答案1
您的公式是正确的;Excel 格式化单元格的方式令人困惑。例如,如果您手动将单元格值设置为18
,然后将格式更改为日期,它将显示为January 18, 1900
。
如果您将包含公式的单元格格式更改为“常规”,它应该会显示您期望的结果。
答案2
我认为您可能会对 Excel 操纵“日期”值感到困惑:它不能。
在 Excel 中,数字用于代表日期(自 1900 年 1 月 0 日起的天数(可能是小数),但它们在 Excel 中以数字形式存储和操作。TODAY() 是一个数值函数,DAY() 是一个从数字参数到数字结果的函数。
在您的例子中,DAY(TODAY()) 正确返回了 18(一个数字),我想您将其分配给一个格式化为以短格式显示日期的单元格 - 因此 18 显示为 18/01/1900。因为对于 Excel 来说,当 18 被解释为日期时,它就是这个意思。
如果将该单元格格式化为数字格式,您将看到答案以您预期的方式显示,即 18。
答案3
答案4
您的公式编写正确。意外结果是由于 Excel 存储不同类型的数据的方式造成的。
根据工作簿级别设置,Excel 使用两个类似的系统来存储日期。
1900 日期系统
在 1900 日期系统中,支持的第一天是 1900 年 1 月 1 日。输入日期时,该日期将转换为序列号,表示自 1900 年 1 月 1 日以来经过的天数。例如,如果输入 1998 年 7 月 5 日,Excel 会将该日期转换为序列号 35981。
默认情况下,Windows 版 Microsoft Excel 使用 1900 日期系统。1900 日期系统可使 Excel 与其他电子表格程序(如 Lotus 1-2-3)更好地兼容,这些程序设计为在 MS-DOS 或 Microsoft Windows 下运行。
1904 日期系统
在 1904 日期系统中,支持的第一天是 1904 年 1 月 1 日。输入日期时,该日期将转换为序列号,表示自 1904 年 1 月 1 日以来经过的天数。例如,如果输入 1998 年 7 月 5 日,Excel 会将该日期转换为序列号 34519。
默认情况下,Macintosh 版 Microsoft Excel 使用 1904 日期系统。由于早期 Macintosh 计算机的设计,不支持 1904 年 1 月 1 日之前的日期。此设计旨在防止与 1900 年不是闰年相关的问题。如果切换到 1900 日期系统,Macintosh 版 Excel 会支持最早为 1900 年 1 月 1 日的日期。
序列号是自 1900 年 1 月 1 日以来日期数量的简单运行计数,包括虚构的日期 1900 年 2 月 29 日。但是,DAY 函数还可以被视为数据类型转换函数。它需要一个日期 序列号作为输入并返回整数作为输出。在你的例子中,如果我们想到18表示日期序列,从 1900 年 1 月 1 日开始向前数 18 天,最终得到 1900 年 1 月 18 日。
前端的简单修复是将单元格格式更改为其他格式,例如数字或者一般的。这将告诉 Excel 将其显示为整数,而不是尝试将其解释为日期序列。在后端,一切都准备就绪。整数结果可用于任何其他公式,并且会正常运行。
举个例子,假设我们想创建一个条件公式,告诉我们当前月份是否已经过了 15 号。我们可以使用以下方法实现:
=IF(DAY(TODAY())>15,"The 15th has passed","It is not yet the 15th")
使用日期序列来实现相同的结果会困难得多,因此返回整数的 DAY 函数在 Excel 常见用例环境中更有用。