Adicionar uma duração a um momento (moment.js)

149

Versão do momento: 2.0.0

Depois de ler os documentos , achei que isso seria direto (console do 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]…}

Este é um exemplo trivial, mas eu nem consigo fazê-lo funcionar. Sinto que estou perdendo algo grande aqui, mas realmente não entendo. Mesmo isso, isso não parece funcionar:

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

Qualquer ajuda seria muito apreciada.

Edit: Meu objetivo final é fazer um gráfico de status binário como o que estou trabalhando aqui: http://bl.ocks.org/phobson/5872894

Como você pode ver, atualmente estou usando valores x fictícios enquanto soluciono esse problema.

Paul H
fonte

Respostas:

264

Acho que você perdeu um ponto-chave na documentação para .add()

Muda o momento original adicionando tempo.

Você parece tratá-lo como uma função que retorna o resultado imutável. Erro fácil de cometer. :)

Se você usar o valor de retorno, é o mesmo objeto real que você iniciou. É apenas retornado como uma conveniência para o encadeamento de métodos.

Você pode solucionar esse comportamento clonando o momento, conforme descrito aqui .

Além disso, você não pode apenas usar ==para testar. Você pode formatar cada momento para a mesma saída e compará-los, ou apenas usar o .isSame()método

Seu código é agora:

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
fonte
Eu realmente aprecio a resposta, Matt. Isso esclarece muitas coisas. Aqui está o que eu ainda não consigo entender: todas as representações returned_endateque eu sei acessar ainda são à meia-noite, e não às 2 da manhã. Eu preciso que sejam 2 da manhã para que eu possa fazer um gráfico D3 no qual estou trabalhando (consulte a pergunta editada). Obrigado novamente.
Paul H
14
Certifique-se de chamar um dos métodos de exibição, como .format()ou .toDate()ou .unix(). Basta olhar para o momento cru não vai funcionar bem. Você também pode fazer algo como yourmoment.utc().format()formatá-lo como utc em vez da hora local.
precisa
3
Sim, esquecer que esses momentos não são imutáveis ​​leva você de vez em quando. Agradável!
28915 welwellio
30

Estou trabalhando em um aplicativo no qual rastreamos a rota ao vivo. O passageiro deseja mostrar a posição atual do motorista e a hora prevista de chegada para chegar à sua localização. Então, preciso adicionar alguma duração ao tempo atual.

Então, eu encontrei a maneira mencionada abaixo para fazer o mesmo. Podemos adicionar qualquer duração (hora, minutos e segundos) em nosso horário atual por 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

Cumpre minha exigência. Talvez possa ajudá-lo.

Mahima Agrawal
fonte
9
Deve ser 'minutos' e não em 'min'.
quer
2
Deve ser 'minutos' e não 'minutos'. Ou pelo menos pode ser 'm'. Atualize sua resposta!
Ulrich Dohou
1
já são 'minutos' na minha resposta e eu já mencionei que podemos usar 'm' em vez de 'minutos' (veja os comentários da resposta). Eu acho que não há necessidade de atualizar minha resposta.
Mahima Agrawal
6

Para pessoas com um startTime(como 12h: 30: 30) e um duration(valor em minutos como 120), você pode adivinhar o seguinte 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"
Feito na lua
fonte