如何使用javascript完成24小时验证maintaning 12小时格式?

时间:2012-07-04 04:44:58

标签: javascript validation

在我的网络应用程序窗体中有两个名为startTime,closeTime的字段,它们在表的每一行中重复。现在我要从第一行的startTime到最后一行的closeTime验证24小时(1440分钟)。但用户以12小时格式输入时间意味着如果第一行的startTime是08:00 am然后我要检查第二天的08:00 am(我转换成分钟的每一件事)。我试过几种方式但是无法上午到下午到下午失踪的细节请给我帮助。下面是我的代码(每行的第一列都会被调用)

var timeArray=[""],timeArray1=[""],timeNoon,closeNoon,temp=0,sumTime=0; 
function checkTime(){
var startTime,closeTime;
if(rowIndex!=0){//rowIndex is current row index
                    startTime=document.getElementById("logSheetDataTable").rows[rowIndex-1].cells[j].childNodes[0].tBodies[0].rows[0].cells[1].childNodes[0].value;
                    closeTime = document.getElementById("logSheetDataTable").rows[rowIndex-1].cells[j].childNodes[0].tBodies[0].rows[1].cells[1].childNodes[0].value;

                    timeNoon=startTime.substring(6);//to get am or pm
                    startTime = startTime.substring(0,5);//to get tome 08:00
                    timeArray = startTime.split(":");

                    closeNoon=closeTime.substring(6);//to get am or pm
                    closeTime1=closeTime.substring(0,5);
                    timeArray1=closeTime1.split(":");

                    if(timeNoon.toLowerCase()=="pm"){
                        startMin=parseInt((timeArray[0]*60))+parseInt(timeArray[1])+720;
                    }else if(timeNoon.toLowerCase()=="am"){
                        startMin=parseInt((timeArray[0]*60))+parseInt(timeArray[1]);
                    }

                    if(closeNoon.toLowerCase()=="pm"){
                        endMin=parseInt((timeArray1[0]*60))+parseInt(timeArray1[1]+720);
                    }else if(closeNoon.toLowerCase()=="am"){
                        endMin=parseInt((timeArray1[0]*60))+parseInt(timeArray1[1]);
                    }


                    if(startMin<endMin){
                        temp=endMin-startMin;
                    }else if(startMin>endMin){
                        temp=(1440-startMin)+endMin;
                    }

                    sumTime=sumTime+temp;
                    alert("sum: "+sumTime);
}

为sumTime我要检查1440分钟。

1 个答案:

答案 0 :(得分:1)

听起来你有一张看起来像这样的表:

START      END
08:00 am    10:00 am
10:00 am    03:00 pm
03:00 pm    08:00 am

而且你说要验证从第一行的START和最后一行的END已经过了24小时。如果那是 all 你想要做的所有其余代码是什么?

你在代码中得到的计算看起来就像你在行上的每个START和END之间加起来的时间,然后将它们相加,大概是为了检查你是否需要24小时。你没有检查第一个START +最后一个END,所以这是有效的(三个8小时= = 24)?

START      END
01:00 am    09:00 am
01:00 am    09:00 am
01:00 am    09:00 am

当你分割出字符串时,你总是取前5个字符并假设它们的格式为HH:MM。这总是正确的(你永远不会遇到例如缺少0前缀的时间,所以你有8:00am吗?你确定在这之后总会有1个空格吗?在am / pm之前?你确定在am / pm之后什么都没有?所有这些都会影响你的字符串解析是否正常工作......

你提取数字的一些方法对我来说有点狡猾。例如:

startMin=parseInt((timeArray[0]*60))+parseInt(timeArray[1])+720;

仔细看看括号。您在parseInt的结果上调用了(timeArray[0]*60)。在您尝试进行数学运算之前,可能应该调用它:

startMin=(parseInt(timeArray[0])*60)+parseInt(timeArray[1])+720;

这是您拨打parseInt的很多电话的常见问题,可能会导致一些意外问题......

现在,查看单行上每个开始和结束之间时差的计算......

如果时间是下午,请添加12小时(720分钟)将其转换为24小时制。你似乎试图这样做,你也同时把它转换成几分钟。

现在,您有三种情况。

  1. START == END - 这将是0或24小时,目前您似乎不满足于此。
  2. START&gt;结束 - 当天在START时间和结束时间之间滚动。所以,你需要计算(到一天结束的时间)+结束时间。所以在几分钟内,你就会1440 - startMin + endMin。你似乎正确地这样做了......
  3. END&gt; START - 结束的时间晚于开始时间,因此您只需要区别于:endMin - startMin,您似乎也正确地执行此操作。
  4. 因此,您的代码肯定存在问题。我有一点fiddle而且我们的问题基本上就是你的问题。因为你把它们放在了错误的地方,你的数字有时被用作字符串+数字其他字符串,所以有时候不是添加,你会得到连接的数字串联......

    相关修正是:

    if(timeNoon.toLowerCase()=="pm"){
        startMin=(parseInt(timeArray[0])*60)+parseInt(timeArray[1])+720;
    }else if(timeNoon.toLowerCase()=="am"){
        startMin=(parseInt(timeArray[0])*60)+parseInt(timeArray[1]);
    }                       
    
    if(closeNoon.toLowerCase()=="pm"){                
        endMin=(parseInt(timeArray1[0])*60)+parseInt(timeArray1[1])+720;
    }else if(closeNoon.toLowerCase()=="am"){
        endMin=(parseInt(timeArray1[0])*60)+parseInt(timeArray1[1]);
    }