Dodaj czas trwania do chwili (moment.js)

149

Wersja Moment: 2.0.0

Po przeczytaniu dokumentacji pomyślałem, że to będzie proste (konsola 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]…}

To trywialny przykład, ale nie mogę go nawet zmusić do działania. Czuję, że brakuje mi tu czegoś dużego, ale naprawdę tego nie rozumiem. Nawet to wydaje się nie działać:

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

Każda pomoc byłaby mile widziana.

Edycja: moim końcowym celem jest stworzenie binarnego wykresu statusu, takiego jak ten, nad którym pracuję tutaj: http://bl.ocks.org/phobson/5872894

Jak widać, podczas pracy nad tym problemem obecnie używam fikcyjnych wartości x.

Paul H.
źródło

Odpowiedzi:

264

Myślę, że przegapiłeś kluczowy punkt w dokumentacji .add()

Mutuje oryginalny moment, dodając czas.

Wydaje się, że traktujesz to jako funkcję, która zwraca niezmienny wynik. Łatwy błąd. :)

Jeśli użyjesz wartości zwracanej, jest to ten sam rzeczywisty obiekt, z którym zacząłeś. Jest po prostu zwracany jako udogodnienie dla łączenia metod.

Możesz obejść to zachowanie, klonując moment, jak opisano tutaj .

Nie możesz też po prostu ==przetestować. Możesz sformatować każdy moment do tego samego wyniku i porównać je lub po prostu użyć tej .isSame()metody.

Twój kod to teraz:

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
źródło
Naprawdę doceniam odpowiedź, Matt. To wyjaśnia wiele rzeczy. Oto, czego nadal nie returned_endatemogę sobie wyobrazić : każda reprezentacja, do której wiem, jak uzyskać dostęp, jest nadal o północy, a nie o 2 w nocy. Potrzebuję drugiej w nocy, abym mógł stworzyć wykres D3, nad którym pracuję (zobacz edytowane pytanie). Dzięki jeszcze raz.
Paul H
14
Upewnij się, że wywołujesz jedną z metod wyświetlania, na przykład .format()lub .toDate()lub .unix(). Samo patrzenie na surowy moment nie zadziała dobrze. Możesz również chcieć zrobić coś takiego, jak yourmoment.utc().format()sformatowanie go jako utc zamiast czasu lokalnego.
Matt Johnson-Pint
3
Tak, zapominanie, że te chwile nie są niezmienne, dopada cię od czasu do czasu. Miły!
welbornio
30

Pracuję nad aplikacją, w której śledzimy na żywo trasę. Pasażer chce pokazać aktualną pozycję kierowcy i przewidywany czas przybycia na miejsce. Więc muszę dodać trochę czasu trwania do bieżącego czasu.

Więc znalazłem niżej wymieniony sposób, aby zrobić to samo. Możemy dodać dowolny czas trwania (godzinę, minuty i sekundy) do naszego aktualnego czasu po chwili:

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

Spełnia moje wymagania. Może to może ci pomóc.

Mahima Agrawal
źródło
9
Powinno to być „minuty”, a nie „minuty”.
Tanvi Agarwal
2
Powinno to być „minuty”, a nie „minuty”. A przynajmniej może to być „m”. Zaktualizuj swoją odpowiedź!
Ulrich Dohou,
1
w mojej odpowiedzi jest już „minuty”, a wspomniałem już, że zamiast „minut” można użyć „m” (patrz komentarze do odpowiedzi). Myślę, że nie ma potrzeby aktualizowania mojej odpowiedzi.
Mahima Agrawal,
6

W przypadku osób mających a startTime(np. 12h: 30:30) i a duration(wartość w minutach, np. 120), możesz odgadnąć, endTimeco następuje:

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"
Wykonane na Księżycu
źródło