You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 20:24:28