直播时长对账
主播播了 3 场,第一场 2:15:30,第二场 1:48:20,第三场 0:52:45。结算时按总时长算补贴,手动加和容易进位错。把三段时间逐行输入本工具,直接得到合计 4:56:35,和平台后台数据核对无出入,避免因计算误差少拿几百块补贴。
录完一段两小时的播客,发现中间补录了三次,算总时长时容易把 hh:mm:ss 加错。这个工具把时间加减和合计收进一个输入框,按行粘贴或手动输入 12:34:56 这种格式,自动对齐进位,结果精确到秒。所有运算在浏览器里完成,时间数据不会离开本地——适合剪辑师核对素材时长、排班算工时、或者单纯想确认“3 小时 17 分 22 秒减去 45 分 8 秒”等于多少的人。
主播播了 3 场,第一场 2:15:30,第二场 1:48:20,第三场 0:52:45。结算时按总时长算补贴,手动加和容易进位错。把三段时间逐行输入本工具,直接得到合计 4:56:35,和平台后台数据核对无出入,避免因计算误差少拿几百块补贴。
教练安排一周 5 次训练,每次时长不同:周一 0:45:00、周三 1:15:00、周五 1:30:00、周六 0:50:00、周日 0:30:00。想算这周总运动时长是否达标(目标 5 小时)。用本工具累加得到 4:50:00,还差 10 分钟,决定周六加一组 15 分钟 HIIT 凑满。
周例会原定 1 小时,实际开了 1:45:30。老板让行政统计本月 4 次会都超了多久:第一次超 0:12:15,第二次超 0:08:40,第三次超 0:25:10,第四次超 0:15:25。用工具合计超时 1:01:30,等于多开了 1 小时会,数据贴到周报里推动议程改革。
员工一个月迟到 3 次:8:12:30(晚到 12 分 30 秒)、8:05:15(晚到 5 分 15 秒)、8:20:10(晚到 20 分 10 秒)。HR 需按累计迟到时长扣绩效。手动加 12:30 + 5:15 + 20:10 = 37:55,用本工具输入三个时间差直接出结果,避免手算进位错误导致扣薪纠纷。
剪辑师合并 4 段素材:A 段 0:03:45、B 段 0:05:20、C 段 0:02:10、D 段 0:04:35。客户要求成片不超过 15 分钟。用工具合计 0:15:50,超了 50 秒,于是把 C 段剪掉 1 分钟(变成 0:01:10),重新加总得到 0:14:50,符合要求。
| 维度 | 本工具 | 在线计算器 | 手工计算 |
|---|---|---|---|
| 隐私 | 纯浏览器计算,数据不上传 | 部分工具需提交至服务器 | 完全离线,无数据泄露风险 |
| 速度 | 输入即出,无网络延迟 | 依赖网络响应,高峰期可能卡顿 | 需手动逐位计算,耗时较长 |
| 批量处理 | 支持多条时间表达式一次性输入并合计 | 多数仅支持单条加减 | 需逐条计算再手动汇总 |
| 格式容错 | 自动识别 hh:mm:ss / mm:ss / 纯秒数 | 常要求严格 hh:mm:ss 格式 | 需自行转换统一格式 |
| 负值处理 | 正确显示负时间(如 -01:30:00) | 部分工具报错或返回空 | 需人工标记负号并调整借位 |
| 输入 | 输出 | 说明 |
|---|---|---|
| 01:30:45 + 02:15:20 | 03:46:05 | 常规:两个普通时长相加,验证秒和分的进位(45+20=65秒→1分5秒,30+15+1=46分) |
| 00:00:00 + 05:30:00 | 05:30:00 | 边界:零值加正数,验证零作为加数时结果正确,不出现空串或 NaN |
| 23:59:59 + 00:00:01 | 24:00:00 | 边界:秒进位到天,验证 23:59:59 + 1秒 是否正确处理为 24:00:00(而非 00:00:00 或报错) |
| 10:00:00 - 12:30:00 | -02:30:00 | 易错:结果为负,验证工具是否支持负号输出,以及负号与时长格式的拼接 |
| 99:99:99 + 00:00:01 | 无效输入 | 易错:输入秒/分超过59(99:99:99),验证工具是否做格式校验并给出明确提示,而非静默截断 |
| 01:00:00 + 02:00:00 + 03:00:00 | 06:00:00 | 常规:三个时长连加,验证工具是否支持多个操作数(而非仅二元运算) |
| 00:00:01 - 00:00:02 | -00:00:01 | 边界:最小负差值(-1秒),验证负号前是否补零(-00:00:01 而非 -0:0:1) |
1.负值时长用减号时未括起负号
输入 -1:30:00 + 02:00:00(-1:30:00) + 02:00:00减号与运算符冲突,解析器可能将 -1:30:00 理解为「减 1:30:00」而非「负 1:30:00」。用括号显式标记负值可消除歧义。
2.时长合计时混用正负号导致结果异常
合计 01:00:00 + (-02:00:00) + 03:00:00先统一符号:正数放一组、负数放一组,或按业务逻辑分步计算工具按代数求和,正负混用结果可能是负时长或零,但用户期望的「总工时」通常只计正值。应先筛选再合计。
3.输入超过 23:59:59 的时长当作时间
输入 25:00:00 表示 25 小时输入 25:00:00 即可(工具支持任意大小时长)时间格式 hh:mm:ss 中 hh 通常 ≤23,但本工具接受任意非负整数作为时长。用户常误以为「25 小时」需拆成 1 天 1 小时。
4.秒数超过 59 未进位
输入 01:30:75 表示 1 分 30 秒加 75 秒输入 01:31:15(工具自动进位)hh:mm:ss 的 mm 和 ss 范围是 00-59,但用户可能直接输入 75 秒。工具会按 60 进制自动进位,但输入本身应合法。
5.用冒号分隔时误用全角符号
输入 01:30:00(全角冒号)输入 01:30:00(半角冒号)全角冒号(U+FF1A)与半角(U+003A)在解析时不同,工具只识别半角。全角输入会导致格式错误或解析失败。
6.加减运算中省略加号导致连写
输入 01:00:00 02:00:00(空格分隔)输入 01:00:00 + 02:00:00工具要求显式运算符,空格分隔会被视为无效表达式。用户习惯「连写」但工具需明确运算关系。
7.结果超过 24 小时误以为会显示天数
输入 12:00:00 + 18:00:00,期望显示 1 天 6 小时工具输出 30:00:00(纯小时格式)本工具结果始终以 hh:mm:ss 格式展示,不拆分天。用户若需天级显示,应自行除以 24。
8.秒数带小数未处理
输入 01:30:30.5输入 01:30:30(工具不支持小数秒)工具只接受整数秒。小数秒会被截断或解析失败,需先四舍五入或取整。
T = (H1 + H2) : (M1 + M2 + carry) : (S1 + S2 + carry) (60 进制)
H1, M1, S1第一个时间的时、分、秒H2, M2, S2第二个时间的时、分、秒carry秒/分满 60 向高位进位计算 2:45:30 + 1:35:50:秒 30+50=80 → 80-60=20 秒,进位 1 分;分 45+35+1=81 → 81-60=21 分,进位 1 时;时 2+1+1=4;结果 4:21:20。
5 种主流语言实现,复制即用:
from datetime import timedelta
def add_time(time_str: str, delta_str: str) -> str:
"""hh:mm:ss 格式加减,支持负号"""
def parse(s: str) -> timedelta:
sign = 1
if s.startswith('-'):
sign = -1
s = s[1:]
parts = list(map(int, s.split(':')))
return sign * timedelta(hours=parts[0], minutes=parts[1], seconds=parts[2])
t = parse(time_str)
d = parse(delta_str)
result = t + d
total_seconds = int(result.total_seconds())
sign = ''
if total_seconds < 0:
sign = '-'
total_seconds = -total_seconds
h, r = divmod(total_seconds, 3600)
m, s = divmod(r, 60)
return f"{sign}{h:02d}:{m:02d}:{s:02d}"
print(add_time("10:30:00", "02:15:30")) # 12:45:30
print(add_time("01:00:00", "-00:30:00")) # 00:30:00function addTime(timeStr, deltaStr) {
const parse = (s) => {
let sign = 1;
if (s.startsWith('-')) { sign = -1; s = s.slice(1); }
const [h, m, sec] = s.split(':').map(Number);
return sign * (h * 3600 + m * 60 + sec);
};
let total = parse(timeStr) + parse(deltaStr);
const sign = total < 0 ? '-' : '';
total = Math.abs(total);
const h = Math.floor(total / 3600);
const m = Math.floor((total % 3600) / 60);
const sec = total % 60;
return `${sign}${String(h).padStart(2,'0')}:${String(m).padStart(2,'0')}:${String(sec).padStart(2,'0')}`;
}
console.log(addTime('10:30:00', '02:15:30')); // 12:45:30
console.log(addTime('01:00:00', '-00:30:00')); // 00:30:00package main
import (
"fmt"
"strings"
"strconv"
)
func parse(s string) int {
sign := 1
if strings.HasPrefix(s, "-") {
sign = -1
s = s[1:]
}
parts := strings.Split(s, ":")
h, _ := strconv.Atoi(parts[0])
m, _ := strconv.Atoi(parts[1])
sec, _ := strconv.Atoi(parts[2])
return sign * (h*3600 + m*60 + sec)
}
func addTime(a, b string) string {
total := parse(a) + parse(b)
sign := ""
if total < 0 {
sign = "-"
total = -total
}
h := total / 3600
m := (total % 3600) / 60
s := total % 60
return fmt.Sprintf("%s%02d:%02d:%02d", sign, h, m, s)
}
func main() {
fmt.Println(addTime("10:30:00", "02:15:30")) // 12:45:30
fmt.Println(addTime("01:00:00", "-00:30:00")) // 00:30:00
}#!/bin/bash
# 依赖 date 命令,仅支持正数加减(跨天会出问题)
add_time() {
local base="$1" delta="$2"
# 将 hh:mm:ss 转为秒
local base_sec=$(date -d "1970-01-01 $base UTC" +%s 2>/dev/null)
local delta_sec=$(date -d "1970-01-01 $delta UTC" +%s 2>/dev/null)
local total=$((base_sec + delta_sec - 2*$(date -d '1970-01-01 00:00:00 UTC' +%s)))
date -d "@$total" -u +%H:%M:%S
}
add_time "10:30:00" "02:15:30" # 12:45:30
add_time "01:00:00" "-00:30:00" # 00:30:00(bash 负号需转义)import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class TimeCalc {
public static String addTime(String time, String delta) {
// 仅支持正数加减,跨天会归零
LocalTime t = LocalTime.parse(time, DateTimeFormatter.ofPattern("HH:mm:ss"));
String[] parts = delta.split(":");
int h = Integer.parseInt(parts[0]);
int m = Integer.parseInt(parts[1]);
int s = Integer.parseInt(parts[2]);
LocalTime result = t.plusHours(h).plusMinutes(m).plusSeconds(s);
return result.format(DateTimeFormatter.ofPattern("HH:mm:ss"));
}
public static void main(String[] args) {
System.out.println(addTime("10:30:00", "02:15:30")); // 12:45:30
System.out.println(addTime("01:00:00", "-00:30:00")); // 00:30:00(负号会抛异常)
}
}本工具按 24 小时制直接相加,秒和分满 60 进 1,小时满 24 不进位(结果仍在 00–23 范围)。18:30:00 + 02:45:30 = 21:15:30。如果你手算得到 21:75:30,那是忘了分进位;如果得到 45:15:30,那是把小时也当 60 进制了。工具结果框会同时显示进位过程,点「展开」可对照检查。
可以,但需用「时长合计」模式:把两个时间当成独立时长输入(23:50:00 + 01:10:00),结果 = 25:00:00(1 天 1 小时)。如果直接用「加减」模式做减法 01:10:00 - 23:50:00,会得到负数 -22:40:00,因为工具按同一天处理。跨天场景建议一律用时长合计,或手动把第二天时间加 24 小时再减。
时间格式严格遵循 hh:mm:ss,秒和分钟的范围是 00–59,不能出现 60。12:00:60 里秒位 60 超出上限。常见误输入:把 60 秒当成 1 分 0 秒,正确写法是 12:01:00;或者把 1 分 30 秒写成 01:30,缺少秒位,应补为 00:01:30。输入框右侧有格式示例,鼠标悬停可查看。
本工具和 Excel 的算法完全一致:都按 60 秒进 1 分、60 分进 1 小时。差几秒通常是输入格式不同导致。例如 Excel 里 1 分 30 秒如果写成 0.00104 天(数值格式),再转时间会因浮点精度损失毫秒级误差。本工具只接受 hh:mm:ss 文本,不存在浮点转换,精度到秒。建议检查 Excel 单元格是否设置为了「时间」格式而非「常规」数值。
本工具没有输入数量限制,可以逐次累加:输入第一个时长 → 点加号 → 再输入第二个 → 继续累加,结果区实时更新。对于 10 个片段,推荐先算前 5 个得小计,再算后 5 个得小计,最后把两个小计相加,避免中间输错一个要全部重来。所有历史操作都保留在下方记录区,可随时回看或删除某步。
hh:mm:ss 中的 hh 范围是 00–23,25:00:00 超出小时上限。如果你需要表示「25 小时」这个时长(不是时刻),请用「时长合计」模式,该模式接受任意数值的小时(如 999:59:59)。「加减」模式处理的是具体时刻(一天内的几点几分),所以小时被限制在 0–23。两种模式在页面顶部有切换标签,注意区分使用。
完全离线可用。本工具是纯前端实现(FE),所有计算在你浏览器里完成,不发送任何数据到服务器。页面加载后断网刷新依然能正常加减。首次访问需要联网加载页面文件,之后如果浏览器有缓存,离线也能打开。隐私方面:因为不上传,输入的时间数据不会离开你的设备。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。