Добавьте продолжительность к моменту (moment.js)

Моментная версия: 2.0.0

Прочитав документы, я подумал, что это будет прямолинейно (консоль 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]…}

Это тривиальный пример, но я даже не могу заставить его работать. Я чувствую, что мне не хватает чего-то большого здесь, но я действительно этого не понимаю. Даже это, похоже, не работает:

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

Любая помощь будет высоко оценена.

Edit: Моя конечная цель - составить бинарный график состояния, такой как тот, над которым я работаю здесь: http://bl.ocks.org/phobson/5872894

Как вы можете видеть, в настоящее время я использую фиктивные x-значения, когда я работаю над этой проблемой.

Ответ 1

Я думаю, вы пропустили ключевой момент в документации для .add()

Мутирует исходный момент, добавляя время.

Кажется, вы рассматриваете его как функцию, которая возвращает неизменный результат. Легкая ошибка.:)

Если вы используете возвращаемое значение, это тот же фактический объект, что и тот, с которого вы начали. Он просто вернулся в качестве удобства для цепочки методов.

Вы можете обойти это поведение путем клонирования момента как описано здесь.

Кроме того, вы не можете просто использовать == для тестирования. Вы можете форматировать каждый момент на один и тот же вывод и сравнивать их или просто использовать метод .isSame().

Ваш код:

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

Ответ 2

Я работаю над приложением, в котором мы отслеживаем живой маршрут. Пассажир хочет показать текущую позицию водителя и ожидаемое время прибытия, чтобы добраться до его/ее местоположения. Поэтому мне нужно добавить некоторую продолжительность в текущее время.

Итак, я нашел способ, который был указан ниже, сделать то же самое. Мы можем добавить любую продолжительность (час, минуты и секунды) в наше текущее время к моменту:

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, 'mins').format('hh:mm A');// it will add 11 mins in the current time and will give time in 03:35 PM format

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

Это соответствует моему требованию. Может быть, это может вам помочь.