
本文讲解如何从对象数组中提取时间字段并进行精确的时长减法运算,重点解决小数时间(如 9.11 表示 9:11)不能直接相减的问题,并提供可复用的转换函数。
本文讲解如何从对象数组中提取时间字段并进行精确的时长减法运算,重点解决小数时间(如 9.11 表示 9:11)不能直接相减的问题,并提供可复用的转换函数。
在 JavaScript 中,像 9.11 这样的小数并非真正的“时间”类型,而是一种人为约定的简写(意为 9 点 11 分)。直接用 periods[8].time - periods[7].time 会得到错误结果(例如 15.40 - 14.47 = 0.93),这既不是 93 分钟,也不是 0 小时 93 分钟——它完全违背了时间进制逻辑(1 小时 = 60 分钟,而非 100 分钟)。
因此,必须先将这种“伪小数时间”标准化为统一单位(推荐转为总分钟数),再做算术运算,最后可选择性地转回小数格式便于展示。
✅ 正确做法:两步转换法
-
timeToMinutes(time):将9.11→551分钟(即 9×60 + 11) -
minutesToTime(minutes):将53分钟 →0.53(表示 0 小时 53 分),或用于格式化最终差值
以下是完整、健壮的实现:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const periods = [
{ time: 9.11, name: "advisory" },
{ time: 9.57, name: "second period" },
{ time: 10.48, name: "third period" },
{ time: 11.39, name: "fourth period" },
{ time: 12.30, name: "fifth period" },
{ time: 13.05, name: "lunch" },
{ time: 13.56, name: "sixth period" },
{ time: 14.47, name: "seventh period" },
{ time: 15.40, name: "eighth period" }
];
// 将形如 9.11 的小数转为总分钟数(9*60 + 11 = 551)
const timeToMinutes = (time) => {
const hours = Math.floor(time);
const minutes = Math.round((time - hours) * 100); // 防止浮点误差,如 9.47 → 47.00000000000001
return hours * 60 + minutes;
};
// 将总分钟数转为标准小数时间格式(仅用于显示,如 53 → 0.53;127 → 2.07 表示 2:07)
const minutesToTime = (totalMinutes) => {
const hours = Math.floor(totalMinutes / 60);
const mins = totalMinutes % 60;
return parseFloat(`${hours}.${mins.toString().padStart(2, '0')}`);
};
// 计算第七节到第八节的时间差(即 periods[8] - periods[7])
const diffInMinutes = timeToMinutes(periods[8].time) - timeToMinutes(periods[7].time);
const diffAsTime = minutesToTime(diffInMinutes);
console.log("时间差(分钟):", diffInMinutes); // → 53
console.log("时间差(小数格式):", diffAsTime); // → 0.53(即 53 分钟)⚠️ 注意事项
- ❌ 不要直接对
periods[8].time - periods[7].time运算——这是常见误区; - ✅ 访问对象属性必须用点号加字段名:
periods[7].time(不是periods.time,因为periods是数组,需先索引再取属性); - ?
Math.round()在timeToMinutes中至关重要,可避免 JavaScript 浮点数精度问题(如0.47 * 100可能得46.99999999999999); - ?
minutesToTime返回的是便于阅读的近似小数格式,不适用于后续计算;如需进一步运算,请始终使用分钟整数。
掌握这种“标准化→计算→格式化”的三段式思维,不仅能解决课表时间差,也适用于任何非标准时间表示(如 Excel 时间序列、数据库中字符串时间等)的处理场景。
立即学习“Java免费学习笔记(深入)”;

















