WPS表格日期与时间函数——考勤统计与项目倒计时的实战应用

发布日期:2026-06-11   浏览次数:2

日期和时间,是WPS表格中最常见但也最容易被"绕晕"的数据类型。

你做过这样的操作吗?两个日期相减,得到的不是"相差多少天",而是一个奇怪的小数。明明输入的是"2026/6/11",显示出来的却是"45453"(这是日期的序列值)。计算员工工龄时,用"当前日期减去入职日期"得到的结果是年数还是不精确的天数?一个上午8:30打卡、下午6:15打卡,要计算出实际工作小时数——直接相减得到的是一个看起来不对的小数。

这些困惑的根源在于:WPS表格中的日期和时间,本质上都是数字。 日期是"从1900年1月1日到目标日期经过的天数"(序列值),时间是"一天24小时的小数部分"。理解了这一点,日期时间计算就不再神秘。

WPS表格提供了丰富的日期时间函数——从基础的YEAR、MONTH、DAY到强大的DATEDIF、NETWORKDAYS、WORKDAY、EDATE、EOMONTH等——覆盖了日期计算的所有常见需求。本文将从日期函数的基本概念出发,结合考勤统计、项目倒计时、到期提醒、工龄计算等实战场景,系统讲解这些函数的使用方法。


一、日期与时间在WPS表格中的本质

1.1 日期的序列值

在WPS表格中,每个日期都对应一个唯一的"序列号"——从1900年1月1日(序列值1)开始,每过一天,序列值加1。

2026年1月1日 → 序列值: 46030
2026年6月11日 → 序列值: 46092
2027年1月1日 → 序列值: 46395

这意味着:日期之间可以直接进行加减运算——因为本质上就是数字的加减。

=DATE(2026,6,30) - DATE(2026,6,1)

结果是29(6月1日到6月30日相差29天,不包含起始日期本身)。如果包含第一天,结果需要+1。日期直接相减得到的是相隔"完整天数"。

1.2 时间的序列值

时间在WPS表格中是小数的形式。

  • 0.0 = 0:00(午夜)
  • 0.5 = 12:00(正午)
  • 0.25 = 6:00
  • 0.75 = 18:00

一个完整的"日期时间"值,就是"整数部分(日期)+小数部分(时间)":2026/6/11 14:30 的序列值≈46092 + 0.6042。

1.3 显示格式 vs 存储值

无论单元格显示为"2026年6月11日"还是"2026/06/11",编辑栏中的实际值都是序列值(46092)。不要因为单元格显示了日期格式就认为"它是一个日期"——它的本质还是一个数字。将单元格格式从"日期"改为"常规",你就能看到它的序列值"真面目"。


二、基础日期函数

2.1 获取当前日期与时间

=TODAY()

返回当前日期(不含时间)。每次打开或重新计算时自动更新。

=NOW()

返回当前日期和时间。

区别: TODAY返回日期序列值的整数部分,NOW返回包含时间小数的完整序列值。如果只需要日期(如考勤打卡日期),用TODAY;如果需要精确时间(如任务最后修改时间),用NOW。

2.2 从日期中提取年月日

=YEAR(日期) → 返回年份(四位数字)
=MONTH(日期) → 返回月份(1~12)
=DAY(日期)  → 返回日(1~31)
=WEEKDAY(日期, 返回类型) → 返回星期几(数字)

WEEKDAY的"返回类型"参数:

类型值含义示例(2026/6/11,周四)
1(默认)星期日=1,星期六=75
2星期一=1,星期日=74
3星期一=0,星期日=63

推荐使用类型2——星期一=1,更符合中国人的工作周习惯。

2.3 从日期中获取星期名称

如果希望显示"星期四"而非数字:

=TEXT(A1, "aaaa")

返回"星期四"(完整中文星期名称)。

=TEXT(A1, "aaa")

返回"四"(缩写中文星期名称)。

2.4 构建指定日期

=DATE(年份, 月份, 日)
  • =DATE(2026, 6, 11) → 2026/6/11。
  • 如果月份超过12:DATE自动进位到下一年。=DATE(2026, 14, 1) → 2027/2/1。
  • 如果日为负数:DATE向前倒推。

这个特性在"计算某个月的最后一天"时非常有用——例如获取2026年2月的最后一天:

=DATE(2026, 3, 0)

月份设为3,日设为0——表示"3月0日",即2月的最后一天(2026/2/28)。这是一种非常简洁的月末日期获取方式。


三、日期差计算

3.1 DATEDIF函数:计算两个日期之间的差值

DATEDIF是一个"隐藏函数"——在WPS表格的函数列表中可能不会显示,但可以直接在公式中使用。

=DATEDIF(开始日期, 结束日期, 单位)

单位参数:

单位含义示例(2024/6/11→2026/6/11)
"Y"整年数2
"M"整月数24
"D"整天数730
"YD"不考虑年份的天数差0
"YM"不考虑年份的月数差0
"MD"不考虑月份的日数差0

3.2 DATEDIF的经典应用

计算员工工龄(精确到年):

=DATEDIF(入职日期, TODAY(), "Y")

计算员工工龄(精确到年月日):

=DATEDIF(入职日期, TODAY(), "Y") & "年" & DATEDIF(入职日期, TODAY(), "YM") & "个月" & DATEDIF(入职日期, TODAY(), "MD") & "天"

计算项目已进行天数:

=DATEDIF(开始日期, TODAY(), "D")

计算距离合同到期的剩余天数:

=到期日期 - TODAY()

(日期直接相减,得到整数天数差。如果不包含到期日当天,结果后+1)

3.3 日期直接相减的陷阱

不要"总是"用DATEDIF——最简单的场景:计算两个日期之间相隔多少天,直接用减法即可。

=结束日期 - 开始日期

结果=相隔的天数。如果结束日期=2026/6/30开始日期=2026/6/1,结果是29(天)。

但如果需要"6月1日到6月30日一共包含30天"(包含头尾),需要=结束日期 - 开始日期 + 1

日期直接相减得到的是两个日期间隔的"完整天数",不包含结束日期的当天。这一点在考勤统计中容易造成"少算一天"的误差,需要留意。


四、工作日计算

4.1 NETWORKDAYS函数:计算两个日期之间的工作日天数

=NETWORKDAYS(开始日期, 结束日期, [节假日区域])
  • 自动排除周六和周日。
  • 可选参数"节假日区域":指定一个包含法定节假日的单元格区域,这些日期也会被排除在工作日之外。

示例: 计算2026年6月的工作日天数(假设法定节假日列表在H2:H10):

=NETWORKDAYS(DATE(2026,6,1), DATE(2026,6,30), H2:H10)

4.2 NETWORKDAYS.INTL函数:自定义周末规则

如果周末不是周六和周日(如某些公司的休息日是周五和周六):

=NETWORKDAYS.INTL(开始日期, 结束日期, 11, [节假日区域])

第三个参数(周末类型)的取值:

  • 1:周六+周日(默认)。
  • 11:周日为唯一休息日。
  • 12:周六为唯一休息日。
  • 其他值:使用7位二进制代码表示一周七天——但日常使用中,选择11或12最为实用。

4.3 WORKDAY函数:从指定日期开始计算工作日

=WORKDAY(开始日期, 天数, [节假日区域])
  • 返回"开始日期"之后(或之前)N个工作日的日期。

示例: 项目从2026/6/1开始,需要在15个工作日后提交,提交日期是:

=WORKDAY(DATE(2026,6,1), 15, H2:H10)
  • 自动跳过周末和法定节假日。

倒推: 如果需要计算"结束日期之前的N个工作日",天数为负数:

=WORKDAY(结束日期, -5, 节假日区域)
  • 返回结束日期之前5个工作日的日期。

五、考勤统计实战

5.1 计算工作时长(小时数)

打卡时间为"8:30"和"18:15",计算实际工作小时数:

=(B2 - A2) * 24
  • A2=上班打卡时间,B2=下班打卡时间。
  • 两个时间相减得到时间差(小数),乘以24转换为小时数。
  • 结果:9.75小时(即9小时45分钟)。

5.2 扣除午休后的净工时

如果午休时间为1小时(12:00~13:00),净工时:

=(B2 - A2) * 24 - 1

5.3 计算迟到

上班时间为9:00,如果打卡时间晚于9:00为迟到:

=IF(A2 > TIME(9,0,0), "迟到", "正常")

如果要计算迟到分钟数:

=IF(A2 > TIME(9,0,0), (A2 - TIME(9,0,0)) * 1440, 0)
  • 时间差 *1440(24小时×60分钟) = 分钟数。

5.4 计算加班时长

下班时间为18:00,之后的时间算加班。加班超过30分钟起算:

=IF(B2 > TIME(18,0,0), (B2 - TIME(18,0,0)) * 24, 0)

如果需要"不足30分钟不计算":

=IF(B2 - TIME(18,0,0) >= TIME(0,30,0), (B2 - TIME(18,0,0)) * 24, 0)

5.5 月度考勤汇总表

假设员工每天一条考勤记录:

  • 应出勤天数:NETWORKDAYS(当月第一天到最后一天,排除周末和法定节假日)。
  • 实际出勤天数:COUNTIFS统计打卡时间不为空的记录数。
  • 迟到次数:COUNTIFS统计打卡时间>9:00的记录数。
  • 加班总时长:SUM逐条加班的时长(小时)。

六、项目倒计时实战

6.1 倒计时天数

=截止日期 - TODAY()
  • 结果为正数表示"还有X天"。
  • 结果为负数表示"已过期X天"。
  • 结果为0表示"今天到期"。

6.2 条件格式:到期提醒

使用条件格式为即将到期的任务设置颜色标记:

  • 已过期(红色底色): 条件格式公式——=$A2-TODAY()<0
  • 3天内到期(黄色底色): 条件格式公式——=AND($A2-TODAY()>=0, $A2-TODAY()<=3)
  • 正常(绿色底色或无格式): 上述条件不满足时保持默认。

6.3 综合倒计时显示(天+时+分)

=截止日期时间 - NOW()
  • 将结果单元格格式设置为[h]"小时"m"分钟"——显示剩余的小时和分钟。
  • 或者用公式拆分为天/时/分。

更好的可视化方式——显示为文字:

=INT(截止日期时间 - NOW()) & "天" & TEXT(截止日期时间 - NOW(), "h""小时""m""分钟""")

6.4 里程碑计划表

在项目管理中,常用的里程碑日期计算:

  • 下一个里程碑日期:=WORKDAY(开始日期, 预计工作日数, 法定节假日)
  • 里程碑之间的间隔天数:=DATEDIF(里程碑1, 里程碑2, "D")
  • 里程碑距离今天的天数:=里程碑日期 - TODAY()

七、高级日期时间技巧

7.1 EOMONTH函数:返回月末日期

=EOMONTH(日期, 月数)
  • 返回指定日期之前/之后N个月的月末日期。

示例:

  • =EOMONTH(DATE(2026,6,11), 0) → 2026/6/30(6月的最后一天)。
  • =EOMONTH(DATE(2026,6,11), 1) → 2026/7/31(7月的最后一天)。
  • =EOMONTH(DATE(2026,6,11), -1) → 2026/5/31(5月的最后一天)。

应用场景: 计算月度报表的截止日期、计算工资的计薪周期结束日。

7.2 EDATE函数:加减月份

=EDATE(日期, 月数)
  • 返回指定日期之前/之后N个月的对应日期。

示例:

  • 合同签订日期是2026/6/11,有效期12个月,到期日为:=EDATE(DATE(2026,6,11), 12) → 2027/6/11。
  • 员工试用期3个月,试用期结束日:=EDATE(入职日期, 3) - 1(如果入职当天算第一天)。

7.3 YEARFRAC函数:计算年份占比

=YEARFRAC(开始日期, 结束日期, [基准类型])
  • 返回两个日期之间在一年中的占比(小数)。

示例: 某员工在2026年6月11日入职到2026年12月31日的年资占比:

=YEARFRAC(DATE(2026,6,11), DATE(2026,12,31))
  • 结果≈0.55(约半年)。

在计算不足一年的员工年假比例时非常实用。

7.4 TIME函数:构建时间值

=TIME(小时, 分钟, 秒)
  • =TIME(14, 30, 0) → 14:30。
  • =TIME(9, 0, 0) → 9:00。

在考勤计算中,TIME函数比写字符串更可靠(不受系统日期格式影响)。


八、实战案例

8.1 月度考勤统计表

字段设计:

  • A列:日期(某月的每一天)。
  • B列:上班打卡时间。
  • C列:下班打卡时间。
  • D列:=IF(B2<>"", (C2-B2)*24-1, 0)(净工时,自动排除午休1小时)。
  • E列:=IF(B2>TIME(9,0,0), "迟到", "")
  • F列:=IF(C2>TIME(18,0,0), (C2-TIME(18,0,0))*24, 0)(加班小时数)。

汇总行:

  • 应出勤:=NETWORKDAYS(月初, 月末, 法定节假日)
  • 实际出勤:=COUNTIF(B:B, "<>") - 1(约去除表头)。
  • 迟到次数:=COUNTIF(E:E, "迟到")
  • 加班总时长:=SUM(F:F)

8.2 项目进度表

字段设计:

  • A列:任务名称。
  • B列:负责人。
  • C列:开始日期。
  • D列:计划结束日期。
  • E列:=DATEDIF(C2, D2, "D")(计划工期)。
  • F列:=D2-TODAY()(剩余天数)。
  • G列:=IF(F2<0, "已逾期", IF(F2<=3, "紧急", IF(F2<=7, "即将到期", "正常")))(状态标识)。
  • H列:=NETWORKDAYS(TODAY(), D2)(剩余工作日)。

条件格式: 对G列设置条件格式——"已逾期"红色填充、"紧急"黄色填充。

8.3 合同到期提醒

  • A列:合同编号。
  • B列:合同开始日期。
  • C列:合同到期日期。
  • D列:=C2-TODAY()(距到期天数)。
  • E列:=IF(D2<0, "已过期", IF(D2<=30, "即将到期(30天内)", "正常"))

8.4 工龄工资计算

  • A列:员工姓名。
  • B列:入职日期。
  • C列:=DATEDIF(B2, TODAY(), "Y")(工龄,整年)。
  • D列:工龄工资——如果工龄≥1年,每年增加100元,上限500元: =IF(C2>=1, MIN(C2*100, 500), 0)

九、常见问题

9.1 日期显示为序列号(一串数字)

原因: 单元格格式被设置为"常规"或"数值",而不是"日期"。

解决: 选中单元格→Ctrl+1→"数字"→"日期"→选择你需要的日期格式。

9.2 时间差显示为小数而不是小时数

原因: 两个时间相减得到的是"天"的小数位(如0.4天),不是小时数。

解决: 将时间差乘以24——=(B2-A2)*24——结果即为小时数(如9.5小时)。如果要显示为"小时:分钟"格式,直接将单元格格式设置为[h]:mm

9.3 日期计算中函数返回#VALUE!错误

  • 确认引用的单元格中确实包含日期值(而非看起来像日期的文本)。文本日期需要用DATEVALUE函数转换为真正的日期序列值。
  • 确认DATEDIF的结束日期大于开始日期。如果结束日期早于开始日期,DATEDIF会返回错误。

9.4 节假日列表无效

在NETWORKDAYS函数中使用节假日区域时,确保节假日区域中的日期是真正的日期序列值(而非文本)。输入2026/1/1时还要确认单元格是日期格式,而非被识别为文本。


十、日期处理的最佳实践

10.1 始终使用日期函数而非手动输入

不要手动输入"2026/6/11"这样的文本字符串。始终使用DATE函数或从其他日期单元格引用——这样可以避免格式问题和计算错误,也便于后续用其他函数进行运算。

10.2 规划时间轴

在做项目计划或考勤表时,提前在Excel中建立一个清晰的时间轴——开始日期、结束日期、里程碑日期,使用DATE函数统一管理。后续所有日期计算都基于这些基准日期。

10.3 使用命名区域管理关键日期

对于重要的日期(如法定节假日列表、合同开始日期),使用"公式"→"定义名称"为其命名。这样在公式中使用时(如NETWORKDAYS(A2, B2, 法定节假日))更加直观,也便于在多个公式中统一引用。


结语

WPS表格中的日期与时间函数,是数据处理中"必须掌握"的基础能力。理解了"日期是数字、时间是小数"这一本质后,日期时间计算就不再神秘。DATE函数建立日期、DATEDIF计算差值、NETWORKDAYS统计工作日、WORKDAY推算截止日期、EOMONTH获取月末——这些函数的组合使用,可以覆盖从考勤统计到项目倒计时的几乎所有场景。

最重要的不是记住每一个函数的语法——而是在需要"处理日期"时,能够清晰地知道应该使用哪个函数来解决当前的问题。




本文相关标签

没有相关标签