web-dev-qa-db-fra.com

Ajouter une durée à un moment (moment.js)

Moment version: 2.0.0

Après avoir lu la documentation , je pensais que ce serait simple (console 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]…}

Ceci est un exemple trivial, mais je ne peux même pas le faire fonctionner. Je sens que je manque quelque chose de grand ici, mais je ne comprends vraiment pas. Même cela ne semble pas fonctionner:

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]…}

Toute aide serait très appréciée.

Edit: Mon objectif final est de créer un tableau d’état binaire tel que celui sur lequel je travaille ici: http: // bl. ocks.org/phobson/5872894

Comme vous pouvez le constater, j'utilise actuellement des valeurs x factices pour résoudre ce problème.

119
Paul H

Je pense que vous avez manqué un point clé dans la documentation de .add()

Mutate le moment original en ajoutant du temps.

Vous semblez le traiter comme une fonction qui renvoie le résultat immuable. Erreur facile à faire. :)

Si vous utilisez la valeur de retour, il s'agit du même objet que celui avec lequel vous avez commencé. Il vient tout juste de revenir pour faciliter le chaînage des méthodes.

Vous pouvez contourner ce problème en clonant le moment, comme décrit ici .

En outre, vous ne pouvez pas simplement utiliser == pour tester. Vous pouvez formater chaque instant sur la même sortie et les comparer, ou simplement utiliser la méthode .isSame().

Votre code est maintenant:

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
230
Matt Johnson-Pint

Je travaille sur une application dans laquelle nous suivons une route en direct. Le passager souhaite afficher la position actuelle du conducteur et l'heure d'arrivée prévue à atteindre. J'ai donc besoin d'ajouter une certaine durée à l'heure actuelle.

J'ai donc trouvé le moyen mentionné ci-dessous de faire de même. Nous pouvons ajouter n'importe quelle durée (heure, minutes et secondes) dans notre heure actuelle par moment:

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

Cela répond à mes besoins. Peut-être que cela peut vous aider.

21
Mahima Agrawal

Pour les personnes ayant un startTime (comme 12h: 30: 30) et un duration (valeur en minutes comme 120), vous pouvez deviner le endTime comme ceci:

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"
3
Made in Moon