如何将12小时制字符串时间转整数并添加分钟后转回原格式
解决12小时制时间加减分钟后转回12小时制的问题
问题核心
你遇到的两个关键问题:
- 直接用纯时间字符串(如
"8:03 AM")创建Date对象存在兼容性问题,部分环境会识别为无效日期; getTime()返回的是毫秒级时间戳(从1970-01-01 00:00:00 UTC开始的毫秒数),但你的intToHHMM函数是按秒来计算的,逻辑完全不匹配,自然得不到正确格式。
解决方案:直接处理时间的分钟数(更可靠)
不用依赖Date对象的日期部分,直接把12小时制时间转换为当天的总分钟数,加减后再转回12小时制字符串,步骤如下:
- 解析12小时制时间为总分钟数
拆分时间字符串的时、分和AM/PM标识,计算出当天已经过的总分钟数:
function timeStrToTotalMinutes(timeStr) { const [timePart, period] = timeStr.split(' '); const [hours, minutes] = timePart.split(':').map(Number); // 处理12小时制转24小时制:AM的12点转为0,PM的12点保持12,其他PM小时加12 const adjustedHours = period === 'AM' ? (hours === 12 ? 0 : hours) : (hours === 12 ? 12 : hours + 12); return adjustedHours * 60 + minutes; }
- 添加指定分钟数,处理跨天情况
总分钟数加上指定分钟后,对1440(一天的总分钟数)取模,自动处理跨天:
const originalTime = "8:03 AM"; const addMinutes = 9; const originalTotalMinutes = timeStrToTotalMinutes(originalTime); const newTotalMinutes = (originalTotalMinutes + addMinutes) % 1440; // 处理负数情况(如果是减去分钟数) const adjustedTotalMinutes = newTotalMinutes < 0 ? newTotalMinutes + 1440 : newTotalMinutes;
- 总分钟数转回12小时制字符串
把总分钟数拆分回时、分,再转换为12小时制格式并添加AM/PM:
function totalMinutesToTimeStr(totalMinutes) { let hours = Math.floor(totalMinutes / 60); const minutes = totalMinutes % 60; // 24小时制转12小时制 const period = hours >= 12 ? 'PM' : 'AM'; hours = hours % 12; hours = hours === 0 ? 12 : hours; // 0点转为12 AM,12点保持12 PM // 补零处理,确保hh:mm格式 const formattedHours = hours.toString().padStart(2, '0'); const formattedMinutes = minutes.toString().padStart(2, '0'); return `${formattedHours}:${formattedMinutes} ${period}`; }
完整示例
把上面的函数整合起来,测试你的场景:
function timeStrToTotalMinutes(timeStr) { const [timePart, period] = timeStr.split(' '); const [hours, minutes] = timePart.split(':').map(Number); const adjustedHours = period === 'AM' ? (hours === 12 ? 0 : hours) : (hours === 12 ? 12 : hours + 12); return adjustedHours * 60 + minutes; } function totalMinutesToTimeStr(totalMinutes) { let hours = Math.floor(totalMinutes / 60); const minutes = totalMinutes % 60; const period = hours >= 12 ? 'PM' : 'AM'; hours = hours % 12; hours = hours === 0 ? 12 : hours; const formattedHours = hours.toString().padStart(2, '0'); const formattedMinutes = minutes.toString().padStart(2, '0'); return `${formattedHours}:${formattedMinutes} ${period}`; } // 测试:8:03 AM加9分钟 const originalTime = "8:03 AM"; const addMinutes = 9; const originalTotal = timeStrToTotalMinutes(originalTime); const newTotal = (originalTotal + addMinutes) % 1440; const result = totalMinutesToTimeStr(newTotal); console.log(result); // 输出 "08:12 AM"
为什么不用Date对象?
虽然添加日期后能创建Date,但getTime()返回的是绝对时间戳,你的函数没有考虑日期部分,而且不同环境对日期字符串的解析规则可能不一致,直接处理分钟数的方式更稳定,也不需要处理时区问题(如果只关心当天时间的话)。
内容的提问来源于stack exchange,提问作者Carter James
相关产品推荐
相关产品推荐

