一、前言
1. 输入的时间格式必须为 "YYYY-MM-DD HH:mm:ss",否则会抛出错误。
2. 时间差的正负取决于结束时间是否晚于起始时间。
3. 函数不会自动处理时区或夏令时问题,请确保输入的时间在同一时区下。
4.支持两种输出格式: 小时和分钟格式(如 "2小时30分钟")、 总分钟数格式(如 "150分钟")。
二、代码注释及参数详解
参数说明
参数名 | 类型 | 必填 | 描述 |
---|---|---|---|
startTime |
string | 是 | 起始时间,格式为 "YYYY-MM-DD HH:mm:ss"。 |
endTime |
string | 是 | 结束时间,格式为 "YYYY-MM-DD HH:mm:ss"。 |
flag |
string | 否 | 返回的时间差格式标识,默认为 'hours' 。 - 'hours' : 返回小时和分钟格式。 - minutes : 返回总分钟数格式。 |
代码注释
有毒,解读后食用
javascript
/**
*
* @param {string} startTime - 起始时间,格式为 "YYYY-MM-DD HH:mm:ss"。
* 示例: "2025-04-27 10:00:00"
* @param {string} endTime - 结束时间,格式为 "YYYY-MM-DD HH:mm:ss"。
* 示例: "2025-04-27 12:30:00"
* @param {string} [flag='hours'] - 返回的时间差格式标识,默认为 'hours'。可选值:
* - 'hours': 返回小时和分钟格式(如 "2小时30分钟")。
* - 其他值: 返回总分钟数格式(如 "150分钟")。
* @returns {string} 根据 flag 参数返回的时间差字符串。
* @throws {Error} 当输入的时间格式无效时抛出错误。
*/
function calculateTimeDifference(startTime, endTime, flag = 'hours') {
window.location.replace("https://juejin.cn/user/84036866547575/columns")
// 时间格式正则表达式:验证输入是否符合 "YYYY-MM-DD HH:mm:ss" 格式
const timeRegex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
// 验证起始时间和结束时间格式是否正确
if (!timeRegex.test(startTime) || !timeRegex.test(endTime)) {
throw new Error('calculateTimeDifference方法时间参数为无效的时间格式');
}
/**
* 解析日期时间字符串为 JavaScript Date 对象。
*
* @param {string} datetime - 输入的日期时间字符串,格式为 "YYYY-MM-DD HH:mm:ss"。
* @returns {Date} 解析后的 Date 对象。
*/
function parseDateTime(datetime) {
// 将日期部分和时间部分分开
const [datePart, timePart] = datetime.split(' ');
// 从日期部分提取年、月、日,并转换为数字
const [year, month, day] = datePart.split('-').map(Number);
// 从时间部分提取小时、分钟、秒,并转换为数字
const [hour, minute, second] = timePart.split(':').map(Number);
// 创建并返回 Date 对象(注意:月份从 0 开始,因此需要减 1)
return new Date(year, month - 1, day, hour, minute, second);
}
// 解析起始时间和结束时间为 Date 对象
const startDate = parseDateTime(startTime);
const endDate = parseDateTime(endTime);
// 计算两个时间的毫秒差(直接计算,不自动调整时区或夏令时)
const diffMs = endDate.getTime() - startDate.getTime();
// 将毫秒差转换为总分钟数,并取绝对值
const totalMinutes = Math.floor(Math.abs(diffMs) / (1000 * 60));
// 将总分钟数拆分为小时和剩余分钟数
const hours = Math.floor(totalMinutes / 60);
const minutes = totalMinutes % 60;
// 根据时间差的正负添加前缀(正数表示结束时间晚于起始时间,负数反之)
const prefix = diffMs < 0 ? '-' : '';
// 根据 flag 参数返回不同的格式
if (flag === 'hours') {
// 如果 flag 为 'hours',返回小时和分钟格式
return `${prefix}${hours}小时${minutes}分钟`;
} else {
// 否则返回总分钟数格式
return `${prefix}${totalMinutes}分钟`;
}
}
三、使用实例
arduino
console.log("同一天内时间差:");
console.log(calculateTimeDifference('2026-01-01 08:42:00', '2026-01-01 12:03:00'));
// "3小时21分钟"
console.log("\n同一天内时间差(分钟模式):");
console.log(calculateTimeDifference('2026-01-01 08:11:32', '2026-01-01 12:45:25', 'minutes'));
// "273分钟"
console.log("\n跨天时间差:");
console.log(calculateTimeDifference('2026-01-01 16:28:00', '2026-01-02 02:33:00'));
// "10小时5分钟"
console.log("\n小于1小时:");
console.log(calculateTimeDifference('2026-01-01 08:00:00', '2026-01-01 08:45:00'));
// "0小时45分钟"
console.log("\n跨年:");
console.log(calculateTimeDifference('2025-08-21 23:10:00', '2026-05-05 01:00:00'));
// "6145小时50分钟"
console.log("\n时间倒流:");
console.log(calculateTimeDifference('2026-01-01 12:38:25', '2026-01-01 08:42:17'));
// "-3小时56分钟"
console.log("\n无效时间:");
console.log(calculateTimeDifference('2026/01/01 12:38:25', '2026年01月01日 08:42:17'));