JavaScript 中的繁琐时间解析

Cumbersome time parsing in JavaScript

我需要一个函数来将文本中的时间从包含时段字母的格式转换为数字。 例如。 4:15PM -> 16:15,4:15AM -> 4:15AM。目前我有以下解决方案

function formatTime(text){
 var find = '([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9] (AM|PM)';
 
 var reg = new RegExp(find, 'g');
 
 pos = 0;

 var result;
 var formatedText = "";
 while((result = reg.exec(text)) !== null) {
  if(result[2] == "PM"){
   var hours= parseInt(result[0], 10);
   hours = hours + 12;
   var hoursStr = hours.toString();
   var newTime = hoursStr + result[0].substring(result[1].length,result[0].length - 3);
   
   formatedText += newTime;
   pos = reg.lastIndex;
  } else {
   formatedText += text.replace("AM","").substring(pos, reg.lastIndex);
   pos = reg.lastIndex;
  }
 }
 
 if(pos < text.length){
  formatedText += text.substring(pos, text.length);
 }
 
 return formatedText;
}

console.log(formatTime("Some Text (11:00AM - 1:00PM)"));

我做了很好的案例,比如 console.log(格式时间("Some Text (11:00AM - 1:00PM)"));

但我努力让它处理 console.log(格式时间("Some Text (11:00 AM - 1:00 PM)"));

这适用于您的示例。 我在正则表达式中添加了 \s? 并对缩短时间的逻辑做了一个小改动(-2 而不是 -3)。此外,我已将变量定义移动到函数的开头以反映 JavaScript.

中的提升
function formatTime(text){
    var find = '([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]\s?(AM|PM)';            
    var reg = new RegExp(find, 'g');            
    var pos = 0;
    var formatedText = "";
    var result, hours, hoursStr, newTime;           

    while ((result = reg.exec(text)) !== null) {
        if (result[2] === "PM") {
            hours= parseInt(result[0], 10);
            hours = hours + 12;
            hoursStr = hours.toString();
            newTime = hoursStr + result[0].substring(result[1].length, result[0].length - 2);

            formatedText += newTime;                    
        } else {
            formatedText += text.replace("AM","").substring(pos, reg.lastIndex);

        }

        pos = reg.lastIndex;
    }

    if (pos < text.length) {
        formatedText += text.substring(pos, text.length);
    }

    return formatedText;
}

这里有一个更简单的方法:只需使用两个函数。一个用于转换小时,另一个用于匹配 PM 次以及 replace() 函数。

很简单...

function convertTime12to24(time12h) {
  const [time, modifier] = time12h.split(' ');

  let [hours, minutes] = time.split(':');

  if (hours === '12') {
    hours = '00';
  }

  if (modifier === 'PM') {
    hours = parseInt(hours, 10) + 12;
  }

  return hours + ':' + minutes;
}


function formatTime(i_string) {
  console.log(i_string.replace(/([0-9]|0[0-9]|1[0-9]|2[0-3]):([0-5][0-9])(PM)/gi, function newDate(x) {

    return convertTime12to24(x.replace("PM", " PM"))
  }));
}
formatTime("The time is now 4:15PM");
formatTime("The time is now 12:15PM");
formatTime("The time is now 4:00AM");
formatTime("The time is now 12:00AM");
formatTime("The time is now 11:00PM");