跳到主要内容
CalcMax

加班费计算器

范围:0 – 24

范围:1 – 5

范围:0.01 – 1,000,000,000

结果

307.50

工资合计

正常工资
240.00
加班工资
67.50
加班工时
1.50 小时
折算时薪
32.37

加班费计算器要回答的不是考勤表能回答的那个问题。考勤表说的是这一周上了多少小时;本页说的是一个班次在超过正常工时的那几个小时按更高倍率计酬之后值多少。页面的形状就是从这句话来的。填这一班几点开始、几点结束,班次里有几个小时算正常工时,超出的部分按几倍算,以及正常时薪,结果区给出这一天的合计工资,下面依次是正常工资、加班工资、加班小时数与折算时薪。默认班次是 09:00 到 18:30、正常工时 8 小时、时薪 30、倍率 1.5,也就是九个半小时:其中 8 小时按 30 算是 240.00,剩下 1.5 小时按 45 算是 67.50,这一天合计 307.50。中间那个 67.50 是最值得用手验算的一行,因为「1.5 小时按一倍半」是随便一张纸就能算完的乘法。这里用两个时刻而不是直接填小时数,是因为这样一来时长变成算出来的结果而不是输入,而这一点换来一个值得知道的行为:结束时刻早于开始时刻的班次按跨夜读,所以 22:00 到 06:00 是 8 小时而不是负 16 小时。夜班恰恰是最容易积出加班的一类班次,把它读成负数会让整页在夜班上失效。另有两条约定撑着这台算术。工时在参与任何金额计算之前先舍到两位小数,所以面板上的每一行彼此解释得通,而不是各自建在一个略有差别的时长上。以及,两个时刻之间的时间被整个读作工作时间,本页不扣休息——休息是另一页的字段,在第二处给它一个位置就等于给「一个工作日有多长」两个说法。最后一行是折算时薪,也就是这一天的合计除以这一天的时长:默认情形下是 32.37,它既不是正常的 30 也不是加班的 45,而印它出来的意义正在于此。

加班小时数,以及每一个小时数在时薪 30、倍率 1.5 下给这一天加了多少

加班小时数加班工资合计工资
00240
0.522.5262.5
145285
290330
4180420
8360600

每一行都把时薪锁在 30、倍率锁在 1.5、正常工时锁在 8,只让超过那条线的小时数变化,所以末列就是 240.00 的正常工资加上中列那个数。第一行是这六行里最该留着的:不加班时中列是 0,合计仍然是 240.00,这正是「加班一行是空的」与「这一天没付钱」的区别。往下读,加班工资是一条直线——半小时是两小时的四分之一——因为倍率是常数,表里没有任何叠加,第八小时那一行正好是一小时那一行的八倍。表停在加班八小时:配上八个正常工时就是十六小时的一天,再往上班次已经长到「有意思的问题不再是算术」的地步了。

公式

班次时长 = 下班时刻 − 上班时刻(跨夜加 24 小时) | 合计工资 = 时薪 × 正常工时 + 时薪 × 倍率 × 加班工时

startTime
这一班开始的时刻,24 小时制。它让时长成为算出来的结果而不是输入,也让跨夜的班次可以像排班表上那样直接写出来
endTime
这一班结束的时刻。早于开始时刻就按跨夜读,差值加 24 小时;与开始时刻相同则时长为零
regularHoursPerDay
这一班里有几个小时算正常工时。整页就是绕这条线转的:线以下按正常时薪算,线以上按正常时薪乘倍率算
overtimeMultiplier
线以上那一段按正常时薪的几倍算。它是字段而不是常量,所以 1.5 能用、2 能用,合同或当地规则实际写着几倍也能用
hourlyRate
正常时薪。正常工资与加班工资都是它的倍数,所以时薪填 0 会让整个面板变成 0,那不是「这一班挣了多少」而是「没有时薪」
overtimeHours
班次时长减去正常工时,之所以印出来是因为倍率乘的是它:没有这一行,加班工资那一行没法用手验算
blendedRate
这一天的合计除以这一天的时长。它落在正常时薪与加班时薪之间,而落在中间多远,就是这一班里加班占了多大的比重

用在「一个班次里超过正常工时的那几个小时按更高倍率计酬」这一件事上,以及由它带出的两个问题:这一天一共多少,以及多出来的那几个小时值多少。要问的如果是一周里各个班次合起来、或者要把休息扣掉、或者多付的那部分取决于周而不是取决于天,请改用按周计时的考勤表那一页。两页只差一根线,而那根线就是「几个小时算正常工时」。

算例

  1. 默认班次:09:00 到 18:30,正常工时 8,时薪 30,倍率 1.5

    1. 班次时长:18:30 − 09:00 = 9.50 小时
    2. 正常工时:min(9.50, 8) = 8.00 | 加班工时:9.50 − 8.00 = 1.50
    3. 正常工资:30 × 8.00 = 240.00
    4. 加班工资:30 × 1.5 × 1.50 = 67.50
    5. 合计工资:240.00 + 67.50 = 307.50 | 折算时薪:307.50 ÷ 9.50 = 32.37

    折算时薪 32.37 是信息量最大、也最容易被跳过的一行。它既不是正常的 30 也不是加班的 45:它是这一班的平均,而九个半小时里有一个半小时是加班,只把它拉高了 2.37,不是更多。

  2. 夜班:20:00 到 06:00

    1. 班次时长:06:00 − 20:00 = −14.00,加 24 小时 = 10.00 小时
    2. 正常工时:min(10.00, 8) = 8.00 | 加班工时:10.00 − 8.00 = 2.00
    3. 正常工资:30 × 8.00 = 240.00
    4. 加班工资:30 × 1.5 × 2.00 = 90.00
    5. 合计工资:240.00 + 90.00 = 330.00 | 折算时薪:330.00 ÷ 10.00 = 33.00

    没有那条跨夜规则的话,这一条会读成负十四小时,整个面板随之垮掉。有了它,这一班是十小时,其中两小时算加班。这正是用时刻输入而不是用小时数输入的理由:排班表上的夜班就长这样,而改成填时长等于把这段算术挪给填表的人。

  3. 没有加班:09:00 到 17:00

    1. 班次时长:17:00 − 09:00 = 8.00 小时
    2. 加班工时:8.00 − 8.00 = 0.00
    3. 正常工资:30 × 8.00 = 240.00 | 加班工资:30 × 1.5 × 0.00 = 0.00
    4. 合计工资:240.00 | 折算时薪:240.00 ÷ 8.00 = 30.00

    八小时的班次碰上八小时的上限,加班那一行是 0,折算时薪正好等于正常时薪。这是算术在说「没有多出来的部分」,而它比留一行空白有用:这一班在上限之内,页面就用整班按正常时薪计酬把这件事说出来。

  4. 两倍:08:00 到 16:30,时薪 25,倍率 2

    1. 班次时长:16:30 − 08:00 = 8.50 小时
    2. 正常工时:min(8.50, 8) = 8.00 | 加班工时:8.50 − 8.00 = 0.50
    3. 正常工资:25 × 8.00 = 200.00
    4. 加班工资:25 × 2 × 0.50 = 25.00
    5. 合计工资:200.00 + 25.00 = 225.00 | 折算时薪:225.00 ÷ 8.50 = 26.47

    半小时按两倍算是 25.00,而时薪是 25 —— 加班那半小时本身按 50 计酬,折算时薪却只挪到 26.47。折算时薪是整班的平均,只要不是整班都算加班,它永远不会等于加班时薪。

局限

本页只给一个班次定价。它不知道「周」这件事,所以凡是挂在周上而不是挂在天上的规则都在它之外:一周的工时上限、连续第七个工作日、或者跨几个班次才够得着的门槛。它不扣休息,这是决定不是疏漏:两个时刻之间的时间被整个读作工作时间,所以中间有一段不带薪午休的班次会多算一小时,面板上的钱也相应偏高。扣休息的那一页是按周计时的考勤表,带午休的班次该用那一页。倍率由你填,本页对它不作任何声明:它不拿这个数去比对任何法规,不知道这个班次属于哪个国家、哪个州或哪份合同,也不认为 1.5 是不是「超过正常工时该付的倍数」的正确答案。作背景而不是作本页的主张:美国联邦法律把工作周超过四十小时的部分定为一倍半作为下限,而有些地方在天这一层另加规则,其中包含超过某个更长的每日门槛之后按更高倍数计酬——这也是倍率待在输入框里而不是待在公式里的原因之一。这台算术有两条约定值得知道。班次时长在参与任何金额计算之前先舍到两位小数,所以面板上的各行彼此自洽;代价是 18:07 下班的班次会被舍两次,一次舍进小时数、一次在舍金额时,某个数因此可能差一分。以及,零时长的班次返回的折算时薪是 0 而不是空着:没有工时就没有平均可言,而印成空白的那一行与「算了但结果是 0」的那一行在面板上长得一模一样,前者是 bug 的概率高得多。两个时刻填成一样的时刻就会走到这一支,而那个 0 是本页的约定,不是算出来的平均。本页也无法告诉你你填的时薪或倍率是不是适用于你的那一个,它更不能补发工资:它只给一天定价,只定一次。

常见问题

为什么填时刻而不是直接填小时数?
因为这样能把一段算术从填表的人手里拿走。班次时长由两个时刻推出来,而这条推导对最要紧的那种情形有规则:结束时刻早于开始时刻就按跨夜读,所以 20:00 到 06:00 是十小时。直接填时长对白班没问题,遇到夜班就只能自己在纸上算,或者填一个负数——而夜班恰恰是加班最容易堆起来的那一类。
折算时薪是什么,谁会用到它?
它是这一天的合计工资除以这一天的时长,也就是整班每个小时平均下来是多少。默认算例里它是 32.37,而正常时薪是 30、加班时薪是 45。它不是任何人真正拿到的费率:这一班里没有任何一小时是按 32.37 付的。它的用处是当一个「加班占了多少」的单一数字,以及当你要拿这份工作去和另一份工作或另一份合同比较、想知道的是一小时平均值多少而不是一小时按多少计酬时,需要的正是它。
休息要不要扣掉?
本页不扣,而且这是有意的。两个时刻之间的时间被整个读作工作时间,所以中间有一段不带薪小时的班次会算长一小时,面板上的钱也相应偏高。休息是按周计时的考勤表上的一个字段:那一页把一周铺成十四个时刻,并且逐日把休息扣掉。在这里给休息第二个位置,等于让两页对「一个工作日有多长」给出两种说法。休息要紧的时候,用那一页。
本页会套用法定的加班倍率吗?
不会。倍率是输入项,本页也不校验它。它做的事只是把你填的那个倍数乘到超过你设定上限的那几个小时上,正是这一点让它在不同的合同和不同的地方都能用。作为背景:美国联邦法律把工作周超过四十小时的部分定为一倍半作为下限,有些地方还加了一层按天的门槛和更高的倍数——例如加州规定一天超过十二小时的部分不低于正常工资率的两倍。这些规则里哪一条适用于某个班次,是一个关于你在哪里工作的问题,不是算术问题。
班次时长是零的话会怎样?
加班的几行都是 0,这在算术上是对的;折算时薪则显示为 0 而不是留空。这是一个约定,值得把话说清楚:没有工时就没有平均可算,诚实的答案是那个数不存在。本页显示 0,是因为面板上一行空白与「算了但结果是 0」的那一行长得一样,而前者是 bug 的可能性大得多。两个时刻填成一样就会走到这一支。
为什么本页的合计与考勤表那一页的合计不是同一个名字?
因为它们是两个不同的量,而这两个名字值得分开。按周计时的考勤表返回的是毛工资:一周的工时按一个费率算、扣掉休息、里面完全没有加班。本页返回的是这一天的合计,包含加班。两块面板用同一个标签指着两个不同的数,正是要避免的那种失败;所以两页的键不同,尽管两个数都是钱、都待在自己面板的最上面。

参考资料

相关计算器