很多人在Excel里算年龄、做倒计时,第一反应就是用当前日期减出生日期,或者用截止日减今天。思路没错,但真正落地时总会碰到各种诡异状况:明明公式没问题,结果怎么是日期格式;上午还正常的倒计时,下午打开就变成负数;年龄算出来带着小数,看着就别扭。这些问题的根源,往往就是两个看起来人畜无害的函数——NOW和TODAY。
这两个函数在Excel里属于“动态时间”的核心,也是做动态年龄计算和倒计时提醒绕不开的基础。这篇内容就把它们的底层逻辑、组合公式、实际坑点一次讲透,分享一些常规文档里不会写的实战经验,希望帮你少踩几个我曾经踩过的坑。
1. 先把NOW和TODAY的本质差异搞清楚
1.1 两个函数的基本语法与返回机制
很多人觉得NOW和TODAY几乎一样,都是返回当前时间,随手就用了。但它们在Excel内部其实是两个不同的东西,返回值都不一样。
TODAY()没有任何参数,返回的是当前日期,只精确到“天”,它的时间部分是0,也就是零点。比如今天是2025年3月15日,TODAY()返回的就是2025/3/15,如果把它转成数值格式,你会看到46195这样的数字——这是Excel内部存储日期的整数序列值,1900年1月1日是1,每过一天加1。
NOW()同样不需要参数,但它返回的是当前日期加当前时间,精确到秒。NOW()在数值格式下会返回一个带小数的数字,比如46195.6328,其中46195代表日期,0.6328代表从零点到现在经过的时间占一天的比例,换算过来差不多是15:11。
正是这个“要不要小数部分”的区别,后续会直接影响到年龄计算和倒计时的结果表现。
1.2 为什么NOW会“跳动”而TODAY整天不变
我经常用电子表和日历牌来类比这两个函数。
TODAY()就像墙上的日历牌,你早上撕掉昨天的,换上今天的,一整天都不会变。哪怕外面太阳西沉,只要没到午夜,日历牌上的日期还是今天。Excel中TODAY()函数的更新逻辑就是这样:它只在打开工作簿或执行计算时读取一次系统日期,在同一次操作过程中,反复使用TODAY()得到的结果完全一致。
NOW()则更像电子手表,秒针一直在走,你每次低头看,时间都不同。Excel里只要触发一次重算,NOW()就会返回新的当前时间,包含小时、分钟、秒的变化。
理解这一点非常关键,因为在实际操作中,如果只是算年龄,用TODAY()就足够,用NOW()反而可能因为时间精度问题导致年龄在某天横跳。反过来,做分钟级别的倒计时,用TODAY()就不现实,必须用NOW()。
1.3 选错函数引发的经典翻车现场
我之前帮同事改过一份员工生日台账,原先用的公式是DATEDIF(B2, NOW(), "y")。看起来没毛病,但他的表格里B2是员工出生日期,当天正好有人过生日,下午3点打开文件,年龄显示还是去年的数字。他以为是公式错了,折腾半天。
问题出在哪?NOW()返回的是带时间的当前值,而DATEDIF在做日期差时,会先比较时间戳的先后。假设员工出生日期是1990年3月10日,B2存储的是1990/3/10 0:00:00,今年3月10日中午12点,NOW()返回的是2025/3/10 12:00:00,两者相减后的整年数,确实已经跨过生日线,按理说应该没问题。但如果出生日期那里带着非零时间,或者单元格里日期本身就含有时分秒,就很可能出现“明明生日已经过了,整年数还没加上去”的怪事。
换成TODAY()就没有这个问题,因为TODAY()会把时间部分归零,和出生日期的日期部分比较时干净利落,直接得到正确的周岁。
所以第一条经验先说死:**只要是按“天数”或“整年数”做计算,优先用TODA
