Додайте тривалість до моменту (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, над якою працюю (див. Відредаговане запитання). Знову дякую.
Пол H

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(наприклад, 12h: 30: 30) та a 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.