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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:05:42