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

149

Момент версия: 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]…}

Любая помощь приветствуется.

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

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

Пол Х
источник

Ответы:

264

Я думаю, что вы пропустили ключевой момент в документации для .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
Мэтт Джонсон-Пинт
источник
Я действительно ценю ответ, Мэтт. Это проясняет многие вещи. Вот что я до сих пор не могу понять: каждое представление, к returned_endateкоторому я знаю, как получить доступ, все еще в полночь, а не в 2 часа ночи. Мне нужно, чтобы он был в 2 часа ночи, чтобы я мог сделать диаграмму D3, над которой я работаю (см. Отредактированный вопрос). Еще раз спасибо.
Пол Х
14
Убедитесь, что вы вызываете один из методов отображения, например, .format()или .toDate()или .unix(). Просто смотреть на сырой момент не будет хорошо работать. Вы также можете захотеть сделать что-то вроде yourmoment.utc().format()форматирования как utc вместо местного времени.
Мэтт Джонсон-Пинт
3
Да, забыв о том, что эти моменты не являются неизменными, вы получаете время от времени. Ницца!
Welbornio
30

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

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

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

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

Махима Агравал
источник
9
Это должны быть минуты, а не минуты.
Танви Агарвал
2
Это должны быть «минуты», а не «минуты». Или, по крайней мере, это может быть «м». Пожалуйста, обновите свой ответ!
Ульрих Доу
1
это уже «минуты» в моем ответе, и я уже упоминал, что мы можем использовать «m» вместо «минут» (см. комментарии ответа). Я думаю, нет необходимости обновлять мой ответ.
Махима Агравал
6

Для людей, имеющих startTime(например, 12: 30: 30) и duration(значение в минутах, например, 120), вы можете угадать endTimeподобное:

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"
Сделано на Луне
источник