¿Cómo hacer una validación total de 24 horas manteniendo el formato de 12 horas usando javascript?

En mi formulario de aplicación web, tengo dos campos llamados hora de inicio, hora de cierre que se repiten en cada fila de la tabla. Ahora tengo que validar durante 24 horas (1440 minutos) desde la hora de inicio de la primera fila hasta la hora de cierre de la última fila. pero el usuario ingresa la hora en formato de 12 horas significa que si la hora de inicio de la primera fila es a las 08:00 a. m., entonces debo verificar hasta las 08:00 a. m. del día siguiente (todo lo que estoy convirtiendo en minutos). Lo intenté de varias maneras, pero no pude hacer los cálculos faltantes. de am a pm/pm a am por favor ayúdenme. El siguiente es mi código (al hacer clic en la primera columna de cada fila se llamará)

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);
}

para sumTime tengo que verificar 1440 minutos.

preguntado el 04 de julio de 12 a las 05:07

tal vez esta herramienta pueda ayudar mattkruse.com/javascript/fecha -

1 Respuestas

Parece que tienes una tabla que se parece a esto:

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

Y estás diciendo que quieres validar que han pasado 24 horas desde el INICIO en la primera fila y el FIN en la última fila. si eso es todos las ¿Quieres hacer para qué sirve el resto de tu código?

El cálculo que tiene en su código parece que está sumando el tiempo entre cada INICIO y FIN en la fila, luego sumando estos, presumiblemente para verificar si tiene 24 horas. No está comprobando el primer INICIO + último FIN, entonces, ¿es esto válido (tres lotes de 8 horas == 24)?

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

Cuando estás dividiendo la cadena, siempre estás tomando los primeros 5 caracteres y asumiendo que tienen la forma HH:MM. ¿Es esto siempre correcto (nunca encontrará un momento en el que, por ejemplo, el 0 falta el prefijo, por lo que tiene 8:00am? ¿Está seguro de que siempre habrá exactamente 1 espacio después de la hora, antes de la am/pm? ¿Estás seguro de que no hay nada después de las am/pm? Todo esto afectará si su análisis de cadenas funciona correctamente o no ...

Algunas de las formas en que está extrayendo números me parecen un poco dudosas. Por ejemplo:

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

Mire cuidadosamente los corchetes. estas llamando parseInt sobre el resultado de (timeArray[0]*60). Presumiblemente, esto debería llamarlo, antes de intentar hacer operaciones matemáticas:

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

Este es un problema común con muchas de sus llamadas a parseInt que puede estar causando algunos problemas inesperados...

Ahora, mirando el cálculo de la diferencia de tiempo entre cada inicio y final en una sola fila...

Si la hora es pm, agregue doce horas (720 minutos) para convertirlo en un reloj de 24 horas. Parece que estás tratando de hacer esto, también lo estás convirtiendo en minutos al mismo tiempo.

Ahora, tienes tres escenarios.

  1. INICIO == FIN - Esto será 0 o 24 horas, actualmente no parece atender esto.
  2. INICIO > FIN: el día se ha desplazado entre la hora de INICIO y la hora de FIN. Por lo tanto, debe calcular el (tiempo hasta el final del día) + tiempo de FIN. Así que en minutos, tendrías 1440 - startMin + endMin. Parece que lo estás haciendo correctamente...
  3. FIN > INICIO: el final es posterior al inicio, por lo que solo necesita la diferencia: endMin - startMin, de nuevo parece que lo estás haciendo correctamente.

Entonces, debe haber algo mal con tu código. he tenido un poco de violín y resulta que tu problema es básicamente tu paréntesis. Debido a que los tiene en el lugar equivocado, sus números se usan como cadenas a veces + números a veces, por lo que a veces, en lugar de sumar, obtiene una concatenación de los valores que lo desvía...

Las correcciones relevantes son:

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]);
}

Respondido 04 Jul 12, 14:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.