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

149

Version du moment: 2.0.0

Après avoir lu la documentation , j'ai pensé 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 ne peux même pas le faire fonctionner. J'ai l'impression de manquer 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 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 factices pendant que je travaille sur ce problème.

Paul H
la source

Réponses:

264

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

Mute le moment d'origine 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 réel que celui avec lequel vous avez commencé. C'est juste retourné pour faciliter le chaînage de 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 comparer ceux-ci, ou vous pouvez simplement utiliser la .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
Matt Johnson-Pint
la source
J'apprécie vraiment la réponse, Matt. Cela clarifie beaucoup de choses. Voici ce que je n'arrive toujours pas à comprendre: chaque représentation à returned_endatelaquelle je sais accéder est toujours à minuit, et non à 2 heures du matin. J'ai besoin qu'il soit 2 heures du matin pour pouvoir créer un graphique D3 sur lequel je travaille (voir question éditée). Merci encore.
Paul H
14
Assurez-vous d'appeler l'une des méthodes d'affichage, telles que .format()ou .toDate()ou .unix(). Le simple fait de regarder le moment brut ne fonctionnera pas bien. Vous voudrez peut-être également faire quelque chose comme yourmoment.utc().format()le formater en utc au lieu de l'heure locale.
Matt Johnson-Pint
3
Ouais, oublier que ces moments ne sont pas immuables vous obtient de temps en temps. Agréable!
welbornio
30

Je travaille sur une application dans laquelle nous suivons l'itinéraire en direct. Le passager souhaite afficher la position actuelle du conducteur et l'heure d'arrivée prévue pour se rendre à son emplacement. Je dois donc ajouter une 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) à 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 à mon exigence. Peut-être que cela peut vous aider.

Mahima Agrawal
la source
9
Il devrait s'agir de «minutes» et non de «minutes».
Tanvi Agarwal
2
Cela devrait être «minutes» et non «minutes». Ou du moins ça peut être «m». Veuillez mettre à jour votre réponse!
Ulrich Dohou
1
c'est déjà «minutes» dans ma réponse et j'ai déjà mentionné que nous pouvons utiliser «m» au lieu de «minutes» (voir les commentaires de réponse). Je pense qu'il n'est pas nécessaire de mettre à jour ma réponse.
Mahima Agrawal
6

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

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"
Fabriqué en lune
la source