Agregar una duración a un momento (moment.js)

149

Versión de momento: 2.0.0

Después de leer los documentos , pensé que esto sería sencillo (consola Chrome):

var timestring1 = "2013-05-09T00:00:00Z";
var timestring2 = "2013-05-09T02:00:00Z";
var startdate = moment(timestring1);
var expected_enddate = moment(timestring2);
var returned_endate = startdate.add(moment.duration(2, 'hours'));
returned_endate == expected_enddate  // false
returned_endate  // Moment {_i: "2013-05-09T00:00:00Z", _f: "YYYY-MM-DDTHH:mm:ss Z", _l: undefined, _isUTC: false, _a: Array[7]…}

Este es un ejemplo trivial, pero ni siquiera puedo hacerlo funcionar. Siento que me estoy perdiendo algo grande aquí, pero realmente no lo entiendo. Incluso esto no parece funcionar:

startdate.add(2, 'hours')
    // Moment {_i: "2013-05-09T00:00:00Z", _f: "YYYY-MM-DDTHH:mm:ss Z", _l: undefined, _isUTC: false, _a: Array[7]…}

Cualquier ayuda sería muy apreciada.

Editar: Mi objetivo final es hacer un cuadro de estado binario como el que estoy trabajando aquí: http://bl.ocks.org/phobson/5872894

Como puede ver, actualmente estoy usando valores x ficticios mientras trabajo en este problema.

Paul H
fuente

Respuestas:

264

Creo que te perdiste un punto clave en la documentación para .add()

Muta el momento original agregando tiempo.

Parece que lo está tratando como una función que devuelve el resultado inmutable. Fácil error de cometer. :)

Si usa el valor de retorno, es el mismo objeto real con el que comenzó. Se acaba de devolver como una conveniencia para el método de encadenamiento.

Puede evitar este comportamiento clonando el momento, como se describe aquí .

Además, no puede simplemente usar ==para probar. Puede formatear cada momento a la misma salida y compararlos, o simplemente puede usar el .isSame()método.

Tu código es ahora:

var timestring1 = "2013-05-09T00:00:00Z";
var timestring2 = "2013-05-09T02:00:00Z";
var startdate = moment(timestring1);
var expected_enddate = moment(timestring2);
var returned_endate = moment(startdate).add(2, 'hours');  // see the cloning?
returned_endate.isSame(expected_enddate)  // true
Matt Johnson-Pint
fuente
Realmente aprecio la respuesta, Matt. Aclara muchas cosas. Esto es lo que todavía no puedo entender: cada representación de la returned_endateque sé acceder sigue siendo a la medianoche, y no a las 2 a.m. Necesito que sean las 2am para poder hacer un gráfico D3 en el que estoy trabajando (ver pregunta editada). Gracias de nuevo.
Paul H
14
Asegúrese de llamar a uno de los métodos de visualización, como .format()o .toDate()o .unix(). Solo mirar el momento crudo no va a funcionar bien. También es posible que desee hacer algo como yourmoment.utc().format()formatearlo como utc en lugar de hora local.
Matt Johnson-Pint
3
Sí, olvidar que estos momentos no son inmutables te pone de vez en cuando. ¡Agradable!
welbornio
30

Estoy trabajando en una aplicación en la que hacemos un seguimiento de la ruta en vivo. El pasajero desea mostrar la posición actual del conductor y la hora prevista de llegada para llegar a su ubicación. Entonces necesito agregar algo de duración al tiempo actual.

Así que encontré la forma mencionada a continuación para hacer lo mismo. Podemos agregar cualquier duración (hora, minutos y segundos) en nuestro tiempo actual por momento:

var travelTime = moment().add(642, 'seconds').format('hh:mm A');// it will add 642 seconds in the current time and will give time in 03:35 PM format

var travelTime = moment().add(11, 'minutes').format('hh:mm A');// it will add 11 mins in the current time and will give time in 03:35 PM format; can use m or minutes 

var travelTime = moment().add(2, 'hours').format('hh:mm A');// it will add 2 hours in the current time and will give time in 03:35 PM format

Cumple mi requerimiento. Puede que esto te ayude.

Mahima Agrawal
fuente
9
Debería ser 'minutos' no en 'minutos'.
Tanvi Agarwal
2
Debería ser 'minutos' no 'minutos'. O al menos puede ser 'm'. Por favor actualice su respuesta!
Ulrich Dohou
1
ya son 'minutos' en mi respuesta y ya mencioné que podemos usar 'm' en lugar de 'minutos' (vea los comentarios de respuesta). Creo que no es necesario actualizar mi respuesta.
Mahima Agrawal
6

Para las personas que tienen un startTime(como 12h: 30: 30) y un duration(valor en minutos como 120), pueden adivinar endTimelo siguiente:

const startTime = '12:30:00';
const durationInMinutes = '120';

const endTime = moment(startTime, 'HH:mm:ss').add(durationInMinutes, 'minutes').format('HH:mm');

// endTime is equal to "14:30"
Hecho en la luna
fuente