Estoy tratando de encontrar una manera a través de moment.js para convertir dos valores de tiempo, que vienen como tiempos de inicio y finalización, expresados en horas y minutos como valores de cadena, así: inicio: 1:12 y parada: 2:10 , o por la tarde, start: 14:23 , y stop: 15:22 y genera una duración en milisegundos a partir de esto. He intentado lo siguiente, pero me da un resultado NaN :
Solo para aclarar, recibo los datos en formato de cadena. Vea a continuación cómo se ve:
const startValue = "1:12"; const stopValue = "2:10"; // for a duration of 58 minutes const msDuration = moment(stopValue).format('HH:mm').valueOf() - moment(startValue).format('HH:mm').valueOf(); Supongo que el problema aquí es que mi startValue y stopValue deben convertirse primero a un formato diferente, ya que actualmente son valores de cadena. Entonces, ¿cómo puedo convertir un valor de cadena de "1:12" para que sea algo que pueda usar el moment ?
Hay dos problemas con su código:
Análisis no válido
Sus entradas de tiempo no están en un formato estándar que Moment reconozca, por lo que tendrá que usar un análisis formateado para explicarle sus tiempos.
format ting como una cadena antes de llamar a valueOf .
.format() convierte su objeto Moment en una cadena, y las cadenas no se pueden restar. Para resolver esto, simplemente puede soltar la llamada .format() . En su lugar, también puede usar .diff() , que calculará la diferencia por usted.
Entonces, puedes usar cualquiera de estos:
const msDuration = moment(stopValue, "H:mm").valueOf() - moment(startValue, "H:mm").valueOf() const msDuration = moment(stopValue, "H:mm") - moment(startValue, "H:mm") // Subtracting will implicitly call .valueOf() const msDuration = moment(stopValue, "H:mm").diff(moment(startValue, "H:mm"))Según sus comentarios anteriores, reconozco que está recibiendo los tiempos como respuesta en el siguiente formato: "HH: mm".
Si la fecha real realmente no importa, puede convertirla así ( JsFiddle ):
const startValue = "1:12"; const stopValue = "2:10"; // for a duration of 58 minutes const start = { hour: startValue.split(":")[0], minute: startValue.split(":")[0] } const stop = { hour: stopValue .split(":")[0], minute: stopValue .split(":")[0] } const msDuration = moment().hours(stop.hour).minutes(stop.minute).valueOf() - moment().hours(start.hour).minutes(start.minute).valueOf(); //you might get 1 ms less. so jest set also ms to 0 const msDurationA = moment().hours(stop.hour).minutes(stop.minute).milliseconds(0).valueOf() - moment().hours(start.hour).minutes(start.minute).milliseconds(0).valueOf();Entonces, básicamente, está tomando la fecha actual y mutando las horas y los minutos, para que pueda trabajar con moment.Js.
Aunque mi pregunta es, ¿por qué necesitas un momento necesario? también puedes hacerlo en JS nativo:
const startValue = "1:12"; const stopValue = "2:10"; // for a duration of 58 minutes const start = { hour: +startValue.split(":")[0], minute: +startValue.split(":")[1] }; const stop = { hour: +stopValue.split(":")[0], minute: +stopValue.split(":")[1] }; const msDuration = (stop.hour * 3600000 + stop.minute * 60000) - (start.hour * 3600000 + start.minute * 60000); console.log("msDuartion: ", msDuration);Usando vainilla JS:
function getMilliSecs(text) { const spl = text.split(":"); return parseInt(spl[0])*60*60*1000 + parseInt(spl[1])*60*1000; } function getMilliSecsDuration(start, stop) { return getMilliSecs(stop) - getMilliSecs(start); }