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
相关产品推荐
相关产品推荐

