如何在JavaScript中用正则从指定字符串提取并转换时间?
问题描述
我有如下字符串:
var data = "Mon 08:30am - 04:30pm"
需要将其转换为以下格式:
// 预期结果:移除am/pm并将下午时间转为24小时制 Result = 8:30-16:30
我希望用JavaScript正则表达式实现,之前用substring方法效果不好,尝试的代码如下:
var amHourFrom = parseInt(details[0].data.substring(4, 2))); var amMinuteFrom = parseInt(details[0].data.substring(7,2))); var pmHourFrom = parseInt(details[0].data.substring(14, 2))); //04 var pmMinuteFrom = parseInt(details[0].data.substring(17,2))); //30 if(details[0].data.substring(19,2)=="pm"){ {pmHourFrom = hourFrom +12; //04+12 = 16 } var Str= amHourFrom + ":" + amMinuteFrom "-" + pmHourFrom+ ":" + pmMinuteFrom; var result = Str.replace(/^(?:00:)?0?/, '');
想换更合适的方法实现。
解决方案
可以用正则匹配+替换函数的方式搞定,核心是匹配每个时间片段,根据am/pm转换小时数,同时去掉多余的前导零:
const data = "Mon 08:30am - 04:30pm"; const result = data // 处理每个时间的am/pm转换和格式调整 .replace(/(\d{1,2}):(\d{2})(am|pm)/g, (match, hour, minute, period) => { let convertedHour = parseInt(hour, 10); // 下午时间(非12pm)加12 if (period === 'pm' && convertedHour !== 12) { convertedHour += 12; } // 处理12am转为0点(不需要的话可以删掉这行) else if (period === 'am' && convertedHour === 12) { convertedHour = 0; } // 去掉小时前导零,分钟保留两位 return `${convertedHour}:${minute}`; }) // 去掉开头的星期和空格,把中间的" - "换成"-" .replace(/^\w+\s+|\s+-\s+/g, match => match.includes('-') ? '-' : ''); console.log(result); // 输出:8:30-16:30
代码说明:
- 第一个正则
/(\d{1,2}):(\d{2})(am|pm)/g:全局匹配所有小时:分钟am/pm的片段,把小时、分钟、时段分别捕获成分组。 - 替换函数里根据时段调整小时数:pm且不是12点就加12,am且是12点就转成0(如果你的场景不会出现12am,这部分可以省略)。
- 第二个正则
/^\w+\s+|\s+-\s+/g:处理多余的字符,把开头的星期和空格删掉,中间的-替换成-。
如果你的输入格式固定就是「星期 + 上午时间 + - + 下午时间」,也可以用更针对性的写法:
const data = "Mon 08:30am - 04:30pm"; // 直接匹配整个字符串的结构,提取两个时间 const [, time1, time2] = data.match(/^\w+\s+(\d{2}:\d{2}am)\s+-\s+(\d{2}:\d{2}pm)$/); // 单独写个转换时间的函数 const convertTime = (timeStr) => { // 去掉末尾的am/pm,拆分小时和分钟 const [hour, minute] = timeStr.slice(0, -2).split(':'); let convertedHour = parseInt(hour, 10); // 下午时间加12 if (timeStr.endsWith('pm') && convertedHour !== 12) { convertedHour += 12; } // 去掉小时的前导零 return `${convertedHour}:${minute}`.replace(/^0+/, ''); }; const result = `${convertTime(time1)}-${convertTime(time2)}`; console.log(result); // 输出:8:30-16:30
内容的提问来源于stack exchange,提问作者Destiel
相关产品推荐
相关产品推荐

