Estoy tratando de calcular el total de horas y minutos diferentes en dos fechas y horas diferentes:
a continuación está mi código:
let startShiftTime = moment(StartTime, ['DD-MM-YYYY h:mm:ss A']) .utcOffset(0, false) .format('DD-MM-YYYY hh:mm:ss A'); let endShiftTime = moment(EndTime, ['DD-MM-YYYY h:mm:ss A']) .utcOffset(0, false) .format('DD-MM-YYYY hh:mm:ss A'); var TotalSeconds = moment(startShiftTime, 'DD-MM-YYYY hh:mm:ss A') .utcOffset(0, false) .diff( moment(endShiftTime, 'DD-MM-YYYY hh:mm:ss A').utcOffset(0, false), 'seconds', ); var hours = Math.floor(TotalSeconds / 3600); var minutes = Math.floor((TotalSeconds / 60) % 60); console.log( 'startShiftTime: ', startShiftTime, ' endShiftTime: ', endShiftTime, ' hours: ', hours, ' minutes: ', minutes, );Obtengo horas y minutos en todos los casos, excepto que la diferencia de tiempo es de 1 hora o de lo contrario
salida de la consola:
startShiftTime: 02-12-2021 09:00:00 AM endShiftTime: 01-12-2021 09:30:00 PM hours: 11 minutes: 30 startShiftTime: 02-12-2021 04:30:00 PM endShiftTime: 02-12-2021 05:00:00 PM hours: -1 minutes: -30vea en la segunda salida ... la diferencia de tiempo es de solo 30 minutos ... pero en horas obtengo 1
No soy capaz de entender dónde estoy cometiendo un error.
No necesita hacer esos cálculos usted mismo, pero puede usar la API moment.duration :
const startShiftTime = moment('01-12-2021 09:00:00 AM', 'DD-MM-YYYY hh:mm:ss A'); const endShiftTime = moment('01-12-2021 09:30:00 AM', 'DD-MM-YYYY hh:mm:ss A'); const duration = moment.duration(startShiftTime.diff(endShiftTime)); console.log('as hours: ' + duration.asHours(), 'as minutes: ' + duration.asMinutes()); console.log('hours: ' + duration.hours(), 'minutes: ' + duration.minutes()); <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script> PD: obtienes valores negativos porque la diferencia se realiza en la hora de inicio, que es menor que la hora de finalización. Si desea valores positivos, simplemente invierta la diferencia: endShiftTime.diff(startShiftTime)
¿Por qué startShiftTime y endShiftTime son cadenas formateadas en lugar de instancias de moment . Terminas analizándolos de nuevo más tarde.
Estás calculando la diferencia entre tiempos al revés como debería ser.
endShiftTime .diff(startShiftTime,'seconds')Esto lleva a la pregunta obvia, ¿por qué el primer ejemplo se calcula correctamente? Debido a que la hora de finalización del turno es anterior a la hora de inicio, esto no tiene ningún sentido.
Intercambiar las horas de inicio y finalización en su primer ejemplo da como resultado la respuesta correcta en ambos casos.
function calculate(StartTime, EndTime) { let startShiftTime = moment(StartTime, ['DD-MM-YYYY h:mm:ss A']) .utcOffset(0, false); let endShiftTime = moment(EndTime, ['DD-MM-YYYY h:mm:ss A']) .utcOffset(0, false); var TotalSeconds = endShiftTime .diff(startShiftTime,'seconds'); var hours = Math.floor(TotalSeconds / 3600); var minutes = Math.floor((TotalSeconds / 60) % 60); console.log(`startShiftTime: ${startShiftTime.format('DD-MM-YYYY h:mm:ss A')} endShiftTime: ${endShiftTime.format('DD-MM-YYYY h:mm:ss A')} hours: ${hours} minutes: ${minutes}`); } calculate('01-12-2021 09:30:00 PM', '02-12-2021 09:00:00 AM'); calculate('02-12-2021 04:30:00 PM', '02-12-2021 05:00:00 PM'); <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>