212 votes

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

Version de Moment : 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]…}

C'est un exemple trivial, mais je n'arrive même pas à le faire fonctionner. J'ai l'impression de rater quelque chose d'important, mais je ne comprends vraiment pas. Même ça, ça n'a pas l'air de marcher :

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 graphique d'état binaire comme celui sur lequel je travaille ici : http://bl.ocks.org/phobson/5872894

Comme vous pouvez le voir, j'utilise actuellement des valeurs x fictives pendant que je travaille sur ce problème.

336voto

Matt Johnson Points 33433

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

Mutant le moment original en ajoutant du temps.

Vous semblez le traiter comme une fonction qui renvoie un résultat immuable. Une erreur facile à commettre :)

Si vous utilisez la valeur de retour, il s'agit du même objet réel que celui avec lequel vous avez commencé. Il est juste retourné par commodité pour le chaînage de méthodes.

Vous pouvez contourner ce comportement en clonant le moment, comme décrit ici .

De plus, vous ne pouvez pas simplement utiliser == à tester. Vous pourriez formater chaque moment vers la même sortie et les comparer, ou vous pourriez simplement utiliser la fonction .isSame() méthode.

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

54voto

Mahima Agrawal Points 523

Je travaille sur une application dans laquelle nous suivons un itinéraire en direct. Le passager veut voir la position actuelle du conducteur et l'heure d'arrivée prévue pour arriver à son emplacement. J'ai donc besoin d'ajouter une durée à l'heure actuelle.

J'ai donc trouvé le moyen mentionné ci-dessous pour faire la même chose. Nous pouvons ajouter n'importe quelle durée (heure, minutes et secondes) dans notre temps actuel 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

Il répond à mes besoins. Peut-être qu'il peut vous aider.

15voto

Made in Moon Points 818

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

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"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X