Aggiungi una durata a un momento (moment.js)


149

Versione momentanea: 2.0.0

Dopo aver letto i documenti , ho pensato che sarebbe stato semplice (console 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]…}

Questo è un esempio banale, ma non riesco nemmeno a farlo funzionare. Sento che mi manca qualcosa di grosso qui, ma davvero non capisco. Anche questo non sembra funzionare:

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

Qualsiasi aiuto sarebbe molto apprezzato.

Modifica: il mio obiettivo finale è quello di creare un diagramma di stato binario come quello su cui sto lavorando qui: http://bl.ocks.org/phobson/5872894

Come puoi vedere, attualmente sto usando valori fittizi x mentre lavoro a questo problema.

Risposte:


264

Penso che tu abbia perso un punto chiave nella documentazione per .add()

Muta il momento originale aggiungendo tempo.

Sembra che lo tratti come una funzione che restituisce il risultato immutabile. Facile errore da fare. :)

Se si utilizza il valore restituito, è lo stesso oggetto effettivo di quello con cui si è iniziato. È appena tornato come comodità per il concatenamento del metodo.

Puoi aggirare questo comportamento clonando il momento, come descritto qui .

Inoltre, non puoi semplicemente usare ==per testare. Puoi formattare ogni momento sullo stesso output e confrontarli, oppure puoi semplicemente usare il .isSame()metodo.

Il tuo codice è ora:

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

Apprezzo molto la risposta, Matt. Risolve molte cose. Ecco cosa non riesco ancora a capire: ogni rappresentazione a returned_endatecui so accedere è ancora a mezzanotte e non alle 2 del mattino. Ho bisogno che siano le 2 del mattino in modo da poter creare un grafico D3 su cui sto lavorando (vedi domanda modificata). Grazie ancora.
Paul H,

14
Assicurati di chiamare uno dei metodi di visualizzazione, come .format()o .toDate()o .unix(). Basta guardare il momento grezzo non funzionerà bene. Potresti anche voler fare qualcosa di simile yourmoment.utc().format()per formattarlo come utc anziché ora locale.
Matt Johnson-Pint,

3
Sì, dimenticare che questi momenti non sono immutabili ti dà una volta ogni tanto. Bello!
welbornio,

30

Sto lavorando a un'applicazione in cui seguiamo il percorso dal vivo. Il passeggero desidera mostrare la posizione attuale del conducente e l'orario di arrivo previsto per raggiungere la sua posizione. Quindi devo aggiungere un po 'di durata all'ora corrente.

Quindi ho trovato il modo sotto indicato per fare lo stesso. Possiamo aggiungere qualsiasi durata (ora, minuti e secondi) nel nostro momento attuale per momento:

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

Soddisfa le mie esigenze. Può essere che può aiutarti.


9
Dovrebbero essere 'minuti' non in 'minuti'.
Tanvi Agarwal,

2
Dovrebbero essere 'minuti' non 'minuti'. O almeno può essere 'm'. Aggiorna la tua risposta!
Ulrich Dohou,

1
sono già 'minuti' nella mia risposta e ho già detto che possiamo usare 'm' invece di 'minuti' (vedi i commenti della risposta). Penso che non sia necessario aggiornare la mia risposta.
Mahima Agrawal,

6

Per le persone che hanno un startTime(come 12h: 30: 30) e un duration(valore in minuti come 120), puoi indovinare endTimecosì:

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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.