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

JavaScript中将营业时间字符串转换为分时段格式的技术实现问询

JavaScript中将营业时间字符串转换为分时段格式的技术实现问询

看起来你已经朝着正确的方向迈出了一大步!你的代码思路很清晰,已经覆盖了大部分常见的营业时间场景,不过我想给你提几个可以优化的点,让这个转换逻辑更健壮:

  • 兼容多种时间分割符:你代码里用了split('–')匹配长破折号,但实际数据里可能会出现短破折号-,建议用正则split(/[-–]/)来兼容两种符号,避免解析失败。
  • 修复totime函数的逻辑漏洞:当遇到"8–10:30 AM"这种AM/PM在末尾的时段,你的代码处理没问题,但如果是"8 AM–10:30"这种标记在开头的情况就会出错。可以改成先提取整个时段里的AM/PM标记,再统一补到缺少的时间部分。
  • 修正变量名拼写错误:你在单时段处理分支里写了totime(stringa),但参数是string,这里会直接报错,得改成totime(string)。
  • 优化24小时营业的格式:当前返回的'13:00-0:00'可以调整为'13:00-24:00',这样时间格式更统一,后续处理时也更直观,避免0:00带来的混淆。
  • 统一输出时间格式:建议用HH:mm格式输出(比如08:00而非8:00),保证时间字符串的规范性,方便后续展示和编辑。

下面是整合了这些优化点的代码示例:

const hours = [
    "",
    "Closed",
    "8:30 AM–7:30 PM",
    "2:30–7:30 PM",
    "3–7 PM",
    "10 AM–7 PM",
    "8 AM–8:30 PM",
    "8–10:30 AM",
    "Open 24 hours",
    "9–10:30 AM, 2:30–7:30 PM",
    "9 AM–12:30 PM, 2:30–7:30 PM",
    "8 AM–1 PM, 2:30–7 PM",
    "8 AM–1 PM, 2–7 PM",
    "9 AM–12 PM, 2:30–7 PM",
];

let convertedHours = [];

hours.forEach(hourStr => {
    convertedHours.push(convertHours(hourStr));
});

console.log(convertedHours);

function convertHours(timeStr) {
    // 处理特殊固定值
    if (timeStr === "") {
        return { morning: '', afternoon: '' };
    }
    if (timeStr === "Closed") {
        return { morning: 'closed', afternoon: 'closed' };
    }
    if (timeStr === "Open 24 hours") {
        return { morning: '00:00-13:00', afternoon: '13:00-24:00' };
    }

    // 处理多时段(逗号分隔)
    if (timeStr.includes(',')) {
        const [morningSegment, afternoonSegment] = timeStr.split(',').map(s => s.trim());
        const [mStart, mEnd] = parseTimeSegment(morningSegment);
        const [aStart, aEnd] = parseTimeSegment(afternoonSegment);
        return {
            morning: `${mStart.format('HH:mm')}-${mEnd.format('HH:mm')}`,
            afternoon: `${aStart.format('HH:mm')}-${aEnd.format('HH:mm')}`
        };
    }

    // 处理单时段
    const endOfMorning = moment('13:00', 'HH:mm');
    const [segmentStart, segmentEnd] = parseTimeSegment(timeStr);

    if (segmentStart.isBefore(endOfMorning)) {
        if (segmentEnd.isAfter(endOfMorning)) {
            // 时段跨上午和下午
            return {
                morning: `${segmentStart.format('HH:mm')}-13:00`,
                afternoon: `13:00-${segmentEnd.format('HH:mm')}`
            };
        } else {
            // 仅上午营业
            return {
                morning: `${segmentStart.format('HH:mm')}-${segmentEnd.format('HH:mm')}`,
                afternoon: 'closed'
            };
        }
    } else {
        // 仅下午营业
        return {
            morning: 'closed',
            afternoon: `${segmentStart.format('HH:mm')}-${segmentEnd.format('HH:mm')}`
        };
    }
}

function parseTimeSegment(segment) {
    // 兼容长破折号和短破折号
    const [startStr, endStr] = segment.split(/[-–]/).map(s => s.trim());
    // 定义moment支持的解析格式,覆盖更多时间写法
    const timeFormats = ['h:mm A', 'h A', 'h:mm', 'h'];
    
    // 提取当前时段的AM/PM标记
    const periodMatch = segment.match(/(AM|PM)/i);
    const period = periodMatch ? periodMatch[0] : '';
    
    // 解析开始时间
    let startTime = startStr.includes(period) 
        ? moment(startStr, timeFormats) 
        : moment(`${startStr} ${period}`, timeFormats);
    
    // 解析结束时间
    let endTime = endStr.includes(period) 
        ? moment(endStr, timeFormats) 
        : moment(`${endStr} ${period}`, timeFormats);
    
    return [startTime, endTime];
}

这个版本的代码兼容性更强,逻辑也更严谨,能处理更多边缘场景,同时保持了你最初想要的分时段输出格式,方便后续在网页上展示和编辑。

备注:内容来源于stack exchange,提问作者Darkmagister

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 10:37:59