Fügen Sie einem Moment eine Dauer hinzu (moment.js)

149

Moment Version: 2.0.0

Nachdem ich die Dokumente gelesen hatte , dachte ich, dass dies einfach sein würde (Chrome-Konsole):

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

Dies ist ein triviales Beispiel, aber ich kann es nicht einmal zum Laufen bringen. Ich habe das Gefühl, dass mir hier etwas Großes fehlt, aber ich verstehe es wirklich nicht. Auch das scheint nicht zu funktionieren:

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

Jede Hilfe wäre sehr dankbar.

Bearbeiten: Mein Endziel ist es, ein binäres Statusdiagramm wie das zu erstellen, an dem ich hier arbeite: http://bl.ocks.org/phobson/5872894

Wie Sie sehen können, verwende ich derzeit Dummy-X-Werte, während ich dieses Problem durcharbeite.

Paul H.
quelle

Antworten:

264

Ich denke, Sie haben einen wichtigen Punkt in der Dokumentation für verpasst .add()

Mutiert den ursprünglichen Moment durch Hinzufügen von Zeit.

Sie scheinen es als eine Funktion zu behandeln, die das unveränderliche Ergebnis zurückgibt. Leichter Fehler zu machen. :) :)

Wenn Sie den Rückgabewert verwenden, handelt es sich um dasselbe tatsächliche Objekt wie das, mit dem Sie begonnen haben. Es wird nur als Annehmlichkeit für die Methodenverkettung zurückgegeben.

Sie können dieses Verhalten umgehen, indem Sie den Moment wie hier beschrieben klonen .

Sie können auch nicht nur ==zum Testen verwenden. Sie können jeden Moment auf dieselbe Ausgabe formatieren und diese vergleichen oder einfach die .isSame()Methode verwenden.

Ihr Code lautet jetzt:

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
quelle
Ich schätze die Antwort sehr, Matt. Es klärt viele Dinge auf. Folgendes kann ich immer noch nicht verstehen: Jede Darstellung, auf returned_endatedie ich zugreifen kann, ist immer noch um Mitternacht und nicht um 2 Uhr morgens. Ich brauche es 2 Uhr morgens, damit ich ein D3-Diagramm erstellen kann, an dem ich arbeite (siehe bearbeitete Frage). Danke noch einmal.
Paul H
14
Stellen Sie sicher, dass Sie eine der Anzeigemethoden aufrufen, z. B. .format()oder .toDate()oder .unix(). Nur auf den rohen Moment zu schauen, wird nicht gut funktionieren. Möglicherweise möchten Sie es auch yourmoment.utc().format()als utc anstelle der Ortszeit formatieren.
Matt Johnson-Pint
3
Ja, zu vergessen, dass diese Momente nicht unveränderlich sind, bringt dich hin und wieder dazu. Nett!
Welbornio
30

Ich arbeite an einer Anwendung, in der wir die Live-Route verfolgen. Der Passagier möchte die aktuelle Position des Fahrers und die voraussichtliche Ankunftszeit anzeigen, die er an seinem Standort erreichen kann. Also muss ich der aktuellen Zeit eine gewisse Dauer hinzufügen.

Also habe ich den unten genannten Weg gefunden, um dasselbe zu tun. Wir können unserer aktuellen Zeit eine beliebige Dauer (Stunde, Minuten und Sekunden) hinzufügen:

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

Es erfüllt meine Anforderung. Vielleicht kann es Ihnen helfen.

Mahima Agrawal
quelle
9
Es sollte 'Minuten' sein, nicht in 'Minuten'.
Tanvi Agarwal
2
Es sollte "Minuten" sein, nicht "Minuten". Oder zumindest kann es 'm' sein. Bitte aktualisieren Sie Ihre Antwort!
Ulrich Dohou
1
In meiner Antwort sind bereits 'Minuten' und ich habe bereits erwähnt, dass wir 'm' anstelle von 'Minuten' verwenden können (siehe die Kommentare der Antwort). Ich denke, ich muss meine Antwort nicht aktualisieren.
Mahima Agrawal
6

Für Leute mit einem startTime(wie 12h: 30: 30) und einem duration(Wert in Minuten wie 120) können Sie Folgendes erraten 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"
Hergestellt im Mond
quelle