0

私のWebアプリフォームでは、テーブルのすべての行で繰り返されるstartTime、closeTimeという2つのフィールドがあります.今、最初の行のstartTimeから最後の行のcloseTimeまで24時間(1440分)検証する必要があります.しかし、ユーザーは入力します12 時間形式の時間は、最初の行の startTime が午前 08:00 の場合、次の日の午前 8: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 時間の 3 つのロット == 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 の後に何もありませんか? これらはすべて、文字列の解析が正しく機能するかどうかに影響します...

数値を抽出する方法のいくつかは、私には少し危険に見えます。例えば:

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

括弧をよく見てください。parseIntの結果を呼び出してい(timeArray[0]*60)ます。おそらく、数学演算を行う前に、これを呼び出す必要があります。

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

parseIntこれは、いくつかの予期しない問題を引き起こす可能性がある多くの呼び出しで一般的な問題です...

ここで、1 つの行の各開始と終了の間の時間差の計算を見てみましょう...

時刻が午後の場合は、12 時間 (720 分) を追加して 24 時間制に変換します。あなたはこれをやろうとしているようですが、同時にそれを分に変換しています.

これで、3 つのシナリオができました。

  1. START == END - これは 0 または 24 時間のいずれかになります。現在、これに対応していないようです。
  2. START > END - START 時刻と END 時刻の間で日が繰り越されました。したがって、(その日の終わりまでの時間) + END 時間を計算する必要があります。したがって、数分で、1440 - startMin + endMin. あなたはこれを正しくやっているようです...
  3. END > START - End は Start よりも遅いため、違いが必要なだけです: 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 に答える