使用方法
- 打开页面就有一组完整结果:开始 09:00、结束 17:00、间隔 2 小时,结果区已经给出时长 8 小时与可排 4 次,不需要先填任何东西。
- 把开始、结束改成你要算的两个时间点,可以跨午夜(例如 22:00 到 06:00 算作次日 8 小时),也可以只填同日时段;间隔填你想要的排程步长,例如 0.5 表示每半小时一次。
- 任意一个输入框按回车都会立即重新计算;也可以直接点「立即计算」。结果区两行是当场算出来的,不是固定文案。
- 结果区第一行是「起 → 止 时长 X 小时」,第二行是「按间隔 Y 小时排程,可排 N 次」,N 是向下取整,不会把排不下的零头算成一次。
- 「复制结果」复制整段文字,「复制对照表」复制下面那张例表的制表符分隔版本,「导出 CSV」保存成带字节序标记的文件,Excel 双击不乱码。
- 本页不联网、不写本地存储,刷新即回到默认示例,所有数字都在你自己的浏览器里算。
这个小时次数计算器能解决什么
小时次数计算器解决的是「这段时间能排几件事」的问题。排班、定闹钟、安排设备巡检、给直播间拆时段,本质都是先知道总时长,再按固定步长数出能放多少个槽位。
第一类用途是排班与巡检。保安两班倒、机器每 3 小时巡检一次、药每 4 小时吃一次——只要给起止时间和间隔,立刻知道一个班次里能排几班、能巡检几次,不用拿钟表数。
第二类用途是跨午夜与跨天。手写容易在「22:00 到 06:00 到底几小时」上栽跟头,本页把结束早于开始的情况自动当作跨到第二天,并支持日期跨度(例如 1 号 9 点到 3 号 17 点),长跨度也不会算错。
第三类用途是校验预期。你心里估计「每 2 小时一次、8 小时能排 4 次」,页面会如实给出 4 次;如果间隔改成 3 小时,8 小时只能排 2 次(剩下 2 小时不够再排一次),这种零头处理一目了然。
值得一提,本页不会把你的时段或排班数据上传到任何服务器,整个解析与计数都只在你自己的设备上发生。你即便把含敏感信息的排班表、工时记录粘进来,计算过程也不会离开本机,这与需要把文本发到云端处理的在线工具完全不同,因此更适合处理内部排班、巡检工时这类不宜外传的数据。结果区的数字都会保留两位小数,复制出去直接能进表格或文档。
时长与排程次数的原理
本页先用 Date.parse 把「开始」和「结束」解析成 UTC 时间戳(毫秒),再相减除以 3600000 得到小时数。关键在于统一用 UTC,避免浏览器本地时区把同一个钟点解读成不同毫秒数,从而保证 09:00 到 17:00 永远是 8 小时,无论你在哪个时区打开页面。
跨午夜的处理很直接:如果解析出的结束时间戳不大于开始时间戳,就给结束再加一整天(24 × 3600000 毫秒),于是 22:00 到 06:00 变成 22:00 到次日 06:00,差值为 8 小时。跨多天则直接靠真实的日期差,时间戳相减天然支持。
排程次数 = 向下取整(时长 ÷ 间隔)。这是一个整数,代表「完整放下」的槽位数;余下的不足一个间隔的零头不计入,避免给你一个排不下的半次。下面的变量表把每一项写清楚。
| 变量 | 含义 | 处理 | 影响 |
|---|---|---|---|
| 开始 | 起始时间点 | 解析为 UTC 时间戳 | 决定时长起点 |
| 结束 | 终止时间点 | 早于开始则加一天 | 跨午夜自动顺延 |
| 时长 | 两者相差 | 差值 ÷ 3600000 | 结果保留两位小数 |
| 间隔 | 排程步长 | 必须大于 0 | 越小次数越多 |
| 次数 | 可排槽位 | 向下取整(时长÷间隔) | 零头不计入 |
完整示例
默认示例是开始 09:00、结束 17:00、间隔 2 小时。两者都解析成同一天的 UTC 时间戳,差值 8 小时;次数 = 向下取整(8 ÷ 2)= 4 次。也就是说从 09:00 起,每隔 2 小时排一次,可以落在 09:00、11:00、13:00、15:00、17:00——其中 17:00 是终点不算新槽位,所以可排 4 次。
09:00 → 17:00 时长 8.00 小时 按间隔 2.00 小时排程,可排 4 次
把示例改成开始 22:00、结束 06:00、间隔 2 小时,结束早于开始会被顺延到次日,时长仍是 8 小时,可排同样是 4 次;若间隔改成 3 小时,则 8 ÷ 3 = 2.67,向下取整得 2 次,余下的 2 小时不够再排一次。
时间间隔对照表
下表共 14 行,给出几组常见起止与对应时长,含跨午夜、跨天和「分钟折算成小时」的例子。前 12 行默认显示,点工具区的「加载更多」看余下 2 行。所有时长都按「UTC 时间戳相减 ÷ 3600000」得出,与结果区的算法一致。
| 开始 | 结束 | 时长 |
|---|---|---|
| 09:00 | 17:00 | 8.00 小时 |
| 22:00 | 06:00 | 8.00 小时 |
| 23:30 | 00:15 | 0.75 小时 |
| 01-01 09:00 | 01-03 17:00 | 56.00 小时 |
| 90 分 | 1.50 小时 | |
| 45 分 | 0.75 小时 | |
| 08:30 | 12:30 | 4.00 小时 |
| 14:00 | 14:45 | 0.75 小时 |
| 20:00 | 23:30 | 3.50 小时 |
| 00:00 | 06:00 | 6.00 小时 |
| 13:15 | 18:45 | 5.50 小时 |
| 07:00 | 07:30 | 0.50 小时 |
| 10:00 | 10:20 | 0.33 小时 |
| 19:00 | 21:00 | 2.00 小时 |
横向读这张表能看出两条经验:分钟要先除以 60 折算成小时(90 分 = 1.5 小时,45 分 = 0.75 小时),别直接拿分钟当小时用;跨午夜只要结束早于开始就会被顺延一天,所以 22:00 到 06:00 和 09:00 到 17:00 一样是 8 小时。
结果边界与错误提示
- 开始或结束不是「时:分」格式(含空值)时,提示会点名当前值:「时间「」或「17:00」不合法:请按 时:分 的 24 小时制填写,例如 09:00。」
- 间隔必须是大于 0 的数字,填 0、负数或非数字会提示点名具体值,避免除以零或给出无意义次数。
- 结束早于开始时自动顺延到次日,不会报错,也不会把它当成负时长;这是设计行为而非错误。
- 排程次数是向下取整,余下的不足一个间隔的零头不计入;例如 8 小时按 3 小时间隔只得 2 次,结果会如实显示,不会四舍五入成 3 次。
- 时长与间隔都保留两位小数(0.75、1.50 等),格式统一,不会因为输入是整数就省略小数。
- 结果区与错误区都带 role="alert",内容变化会被屏幕阅读器播报;所有数字仅在本地计算,不联网也不写存储。
- 对照表 CSV 导出带字节序标记,Excel 双击不乱码;「复制对照表」是制表符分隔文本,粘进表格软件会自动分列。
- 只接受「时:分」这种纯时间或带日期的写法;若你想算「2026-01-01 09:00 到 2026-01-03 17:00」,用日期差那一行同样的 UTC 相减逻辑,页面已支持真实跨度。
常见问题
为什么要用 UTC 时间戳相减?
因为直接用本地时间相减会被浏览器的时区偏移干扰,同一个钟点在冬令时和夏令时可能差出一小时。统一解析成 UTC 时间戳后,09:00 到 17:00 永远是 8 小时,与时区无关,结果才稳。
22:00 到 06:00 为什么是 8 小时?
结束时间 06:00 早于开始 22:00,本页判定为跨到第二天,于是结束被顺延 24 小时变成次日 06:00,与 22:00 相差正好 8 小时,符合常识。
次数怎么会是 2 而不是 3?
次数 = 向下取整(时长 ÷ 间隔)。8 小时按 3 小时间隔得到 2.67,取整为 2,余下的 2 小时不够再排一次,所以不算。这是「完整槽位」的口径,不是四舍五入。
间隔能填小数吗?
能。间隔接受 0.25、0.5、1.5 这类小数,代表每 15 分钟、半小时、一个半小时一次;下限 0.25 小时、上限 24 小时,超过范围会提示你重新填写。
分钟怎么折算成小时?
除以 60。90 分钟 = 1.5 小时,45 分钟 = 0.75 小时,页面里的「90 分」「45 分」两行就是直接折算的结果,别把分钟当小时用。
跨好几天怎么算?
只要起止是真实日期跨度(例如 1 号 9 点到 3 号 17 点),UTC 时间戳相减天然包含整天,结果 56 小时;纯时间输入(无日期)只在同一天或顺延一天的范围内处理。
为什么结果不带「次」以外的单位?
时长一律以「小时」为单位并保留两位小数,次数则是纯整数,这样和对照表、复制结果都保持一致,便于你直接拿去排班表或文档里用。
导出的 CSV 为什么会带字节序标记?
带字节序标记(BOM)是为了让 Excel 双击打开时正确识别 UTF-8,不会把中文显示成乱码;「复制对照表」则是纯文本制表符分隔,粘进表格软件同样会自动分列。