0

在我的网络应用程序表单中,我有两个字段称为 startTime,closeTime,它们在表的每一行中重复。现在我要验证从第一行的 startTime 到最后一行的 closeTime 的 24 小时(1440 分钟)。但用户输入12 小时格式的时间表示如果第一行的 startTime 是上午 08:00,那么我要检查到第二天上午 08:00(我要转换为分钟的每一件事)。我尝试了多种方式,但无法计算缺失在上午到下午/下午到上午请帮助我。以下是我的代码(点击它会被调用的每一行的第一列)

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 分钟。

4

1 回答 1

1

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

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

你是说你想验证从第一行的 START 到最后一行的 END 已经过去了 24 小时。如果这就是你想做的全部,那么你的代码的其余部分是什么

您在代码中得到的计算看起来像是您将行中每个 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 个空格吗?你确定上午/下午之后什么都没有?所有这些都会影响您的字符串解析是否正常工作......

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

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

仔细看括号。您调用parseInt. (timeArray[0]*60)在您尝试进行数学运算之前,大概应该调用它:

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

这是您的许多电话的常见问题parseInt,可能会导致一些意想不到的问题......

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

如果时间是下午,则添加十二小时(720 分钟)以将其转换为 24 小时制。您似乎正在尝试这样做,同时您也在将其转换为分钟。

现在,您有三种情况。

  1. START == END - 这将是 0 或 24 小时,目前您似乎不满足于此。
  2. START > END - 一天在 START 时间和 END 时间之间翻转。因此,您需要计算(到一天结束的时间)+ END 时间。因此,在几分钟内,您将拥有1440 - startMin + endMin. 您似乎正确地执行了此操作...
  3. END > START - End 比开始晚,所以你只需要区别:endMin - startMin,你似乎再次正确地做这件事。

所以,你的代码一定有问题。我有一点麻烦,它变成了我们的问题基本上是你的包围。因为你把它们放在错误的地方,你的数字有时被用作字符串 + 其他数字,所以有时你得到的不是加法,而是值的串联,这会让你离开......

相关的修复是:

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]);
}
于 2012-07-04T13:11:56.577 回答