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.

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

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.


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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.