2013-06-27 20 views
70

versione Moment: 2.0.0Aggiungi una durata per un momento (moment.js)

After reading the docs, ho pensato che questo sarebbe straight-forward (consolle 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 banale esempio, ma non riesco nemmeno a farlo funzionare. Mi sento come se mi mancasse 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.

Edit: Il mio obiettivo finale è quello di fare un grafico stato binario come quello su cui sto lavorando qui: http://bl.ocks.org/phobson/5872894

Come potete vedere, Attualmente sto usando valori x fittizi, mentre Io lavoro attraverso questo problema.

risposta

153

penso che ti sei perso un punto chiave nella documentazione per .add()

muta il momento originario con l'aggiunta di tempo.

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

Se si utilizza il valore restituito, si tratta dello stesso oggetto effettivo di quello avviato. È appena restituito per comodità per il concatenamento del metodo.

È possibile aggirare questo comportamento clonando il momento, as described here.

Inoltre, non è possibile utilizzare solo il test ==. È possibile formattare ogni momento sullo stesso output e confrontarli, oppure è possibile utilizzare semplicemente il metodo .isSame().

Il 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 
+0

Apprezzo molto la risposta, Matt. Cancella molte cose. Ecco cosa non riesco ancora a capire: ogni rappresentazione di 'return_endate' che so come accedere è ancora a mezzanotte e non alle 2:00. Ho bisogno che sia il 2:00 in modo da poter creare un grafico D3 su cui sto lavorando (vedi domanda modificata). Grazie ancora. –

+8

Assicurati di chiamare uno dei metodi di visualizzazione, come '.format()' o '.toDate()' o '.unix()'. Solo guardando il momento grezzo non funzionerà bene. Potresti anche voler fare qualcosa come 'yourmoment.utc(). Format()' per formattarlo come utc invece di ora locale. –

+2

Sì, dimenticando che questi momenti non sono immutabili ti capita ogni tanto. Bello! – welbornio

6

Sto lavorando su un'applicazione in cui si traccia percorso dal vivo. Il passeggero vuole mostrare la posizione attuale del conducente e l'orario di arrivo previsto per raggiungere la sua posizione. Quindi ho bisogno di aggiungere una certa durata al tempo corrente.

Quindi ho trovato il modo in cui citato di fare lo stesso. Possiamo aggiungere qualsiasi durata (ore, minuti e secondi) nel nostro tempo attuale 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, 'mins').format('hh:mm A');// it will add 11 mins in the current time and will give time in 03:35 PM format 

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 la mia richiesta. Può essere che ti può aiutare.

+5

Dovrebbe essere 'minuti' non in 'minuti'. –

+0

Dovrebbe essere "minuti" e non "minuti". O almeno può essere "m". Si prega di aggiornare la risposta! –

0

Per le persone che hanno un startTime (come 12h: 30: 30) e un duration (valore in minuti come 120), si può intuire il endTime in questo modo:

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"