JavaScript中繁琐的时间解析

JavaScript中繁琐的时间解析,javascript,datetime-parsing,Javascript,Datetime Parsing,我需要一个函数来转换文本中的时间从日期部分字母格式到数字。 例如:下午4:15->16:15,上午4:15->4:15。目前我有以下解决方案 函数格式化时间(文本){ var find='([0-9]| 0[0-9]| 1[0-9]| 2[0-3]):[0-5][0-9](上午|下午); var reg=新的RegExp(查找'g'); pos=0; var结果; var formattext=“”; while((result=reg.exec(text))!==null){ 如果(结果[2

我需要一个函数来转换文本中的时间从日期部分字母格式到数字。 例如:下午4:15->16:15,上午4:15->4:15。目前我有以下解决方案

函数格式化时间(文本){
var find='([0-9]| 0[0-9]| 1[0-9]| 2[0-3]):[0-5][0-9](上午|下午);
var reg=新的RegExp(查找'g');
pos=0;
var结果;
var formattext=“”;
while((result=reg.exec(text))!==null){
如果(结果[2]=“PM”){
var小时数=parseInt(结果[0],10);
小时=小时+12;
var hoursStr=hours.toString();
var newTime=hoursStr+result[0]。子字符串(结果[1]。长度,结果[0]。长度-3);
FormattedText+=新时间;
pos=reg.lastIndex;
}否则{
FormattedText+=text.replace(“AM”,“”)。子字符串(pos,reg.lastIndex);
pos=reg.lastIndex;
}
}
如果(位置<文本长度){
FormattedText+=文本.子字符串(位置,文本.长度);
}
返回格式化文本;
}

log(格式化时间(“一些文本(上午11:00-下午1:00)”)这适用于您的示例。 我已经在正则表达式中添加了
\\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;
}
函数格式化时间(文本){
var find='([0-9]| 0[0-9]| 1[0-9]| 2[0-3]):[0-5][0-9]\\s?(上午|下午);
var reg=新的RegExp(查找'g');
var-pos=0;
var formattext=“”;
var结果,小时数,小时数,新时间;
while((result=reg.exec(text))!==null){
如果(结果[2]=“PM”){
小时=parseInt(结果[0],10);
小时=小时+12;
hourstr=hours.toString();
newTime=hoursStr+result[0]。子字符串(结果[1]。长度,结果[0]。长度-2);
FormattedText+=新时间;
}否则{
FormattedText+=text.replace(“AM”,“”)。子字符串(pos,reg.lastIndex);
}
pos=reg.lastIndex;
}
如果(位置<文本长度){
FormattedText+=文本.子字符串(位置,文本.长度);
}
返回格式化文本;
}

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

别紧张

功能转换时间12到24(时间12h){
常量[时间,修饰符]=时间12小时分割(“”);
让[hours,minutes]=time.split(“:”);
如果(小时数=='12'){
小时数='00';
}
如果(修饰符=='PM'){
小时=parseInt(小时,10)+12;
}
返回时间+':'+分钟;
}
函数格式化时间(i_字符串){
console.log(i_string.replace(/([0-9]| 0[0-9]| 1[0-9]| 2[0-3]):([0-5][0-9])(PM)/gi,函数newDate(x){
返回转换时间12到24(x.replace(“PM”、“PM”))
}));
}
格式化时间(“现在的时间是下午4:15”);
格式化时间(“现在的时间是下午12:15”);
格式时间(“现在的时间是凌晨4:00”);
格式化时间(“现在的时间是12:00AM”);

格式时间(“现在的时间是晚上11:00”)例如4:15PM->16:15,4:15AM->4:15AM,因此如果是PM,您希望转换小时,但如果是AM,您希望离开“AM”“结果如何?是的,我需要将其格式化为这样。您为什么不尝试使用这样的库?为什么要重新发明轮子,浪费你宝贵的时间?图书馆的存在是有原因的,请毫不犹豫地使用它们。诸如“它对我的需求来说太大了”或“我的工作更快了”之类的论点不是真正的论点。人们创造自由软件,我们应该使用它——特别是如果它能节省我们的时间,让我们专注于我们的工作。为什么有效,因为你做了什么?为什么您不为他清理他的regexp,或者按照他应该的方式修复它以使用regexp文本?
g
标志的目的是什么,为什么在
reg.exec
周围有一个循环?但根据OP,他希望保留“AM”。另外,你的代码似乎在删除破折号后的空格。我只是想指出正确的方向-这个网站真的不是为人们创建产品质量的答案-它是为了帮助解决他们的编程问题-因为我不知道/关心他们的算法如何工作,或者它如何获得输出,我只是注意到了打字错误,然后做了一个更正,似乎有一个硬编码的值,这取决于打字错误。我可能会用另一种方法,使用
作为分隔符,然后在小时部分添加12,如果是PM,但是whatever@torazaburo此外,它并没有说他们想在OP中保留上午/下午时间——它说的是下午4:15->16:15原始帖子清楚地说是上午4:15->4:15,保留了“上午”,OP在一个comment.im中确认了这一点,我重新编写代码是为了让它更简单——这是一个糟糕的答案