12小时制转24小时制代码异常 致Google表单同步日历时段错误
12小时制转24小时制逻辑缺陷修复方案
原代码存在的核心问题
- 分支逻辑覆盖不全:AM时段完全没有做特殊处理,12 AM(午夜0点)会被直接识别为中午12点,直接导致时段颠倒。
- 返回值格式不统一:非12点的PM时间返回
时:分两段格式,12点PM和所有AM时间返回带AM/PM标记、带秒的三段格式,后续切割取值时容易出现隐式转换错误。 - 无输入清洗逻辑:没有对输入时间的前后空格、大小写、异常小时值做兼容处理,遇到Google表单自动转换后的非标准12小时制时间(比如小时为00的AM时间)时,容易走错逻辑分支。
- PM分支12点判断逻辑有漏洞:直接返回带PM标记的原始字符串,后续解析时没有剥离AM/PM标记,依赖JS的parseInt隐式转换容错,稳定性极差。
正确的时间转换实现
直接替换原convertTime函数,同时调整combineDate里的时间解析逻辑,统一用标准24小时制格式创建Date对象:
function combineDate(startDate,startTm,endTm) { // 测试用例可根据实际业务删除 startDate = '07/07/2022' startTm = '00:50:00 AM' endTm = '03:00:00 PM' const strDate = startDate.split('/') const dt = parseInt(strDate[0]) const mnth = parseInt(strDate[1])-1 const year = parseInt(strDate[2]) // 转换后拿到标准HH:MM:SS格式的24小时制时间 startTm = convertTime(startTm) endTm = convertTime(endTm) // 统一按三段格式解析,兼容所有返回值 const strTime = startTm.split(':') const sthr = parseInt(strTime[0]) const stMn = parseInt(strTime[1]) const stSec = parseInt(strTime[2]) const endTime = endTm.split(':') const ethr = parseInt(endTime[0]) const etMn = parseInt(endTime[1]) const etSec = parseInt(endTime[2]) const startDT = new Date(year,mnth,dt,sthr,stMn,stSec) const endDT = new Date(year,mnth,dt,ethr,etMn,etSec) console.log({startDT, endDT}) return {startDT, endDT} } function convertTime(timeStr) { // 第一步:清洗输入,去除首尾空格,统一转大写 const cleanedTime = timeStr.trim().toUpperCase() // 拆分时段(AM/PM)和时间主体 const isPM = cleanedTime.includes('PM') const timeWithoutPeriod = cleanedTime.replace(/(AM|PM)/g, '').trim() // 拆分时分秒,秒值缺省默认补00 const [hour, minute, second = '00'] = timeWithoutPeriod.split(':').map(item => item.padStart(2, '0')) let hr = parseInt(hour) // 按12转24规则计算小时 if (isPM) { hr = hr === 12 ? 12 : hr + 12 } else { hr = hr === 12 ? 0 : hr } // 返回统一的HH:MM:SS格式24小时制时间,补前导零 return `${String(hr).padStart(2, '0')}:${minute.padStart(2, '0')}:${second.padStart(2, '0')}` }
关键修复点说明
- 所有输入先做标准化清洗,自动处理空格、大小写问题,兼容Google表单返回的各种非标准时间格式
- 完整覆盖AM/PM全部分支转换规则:
- 12 AM → 0点(午夜)
- 1-11 AM → 保持原小时值
- 12 PM → 12点(中午)
- 1-11 PM → 小时值加12
- 所有返回值统一为
HH:MM:SS三段式24小时制字符串,无多余AM/PM标记,后续解析不会出现格式不一致问题 - 补全秒值默认值,兼容没有传秒的时间输入
- 所有时间单元自动补前导零,避免个位数时间值解析错误
针对你遇到的01:50:00 PM转换场景,修复后的函数会正确识别为PM时段,转换为13:50:00,创建的日历事件会正确落在下午时段,不会被误判为AM。
内容的提问来源于stack exchange,提问作者Khan
相关产品推荐
相关产品推荐

