Como posso calcular o tempo entre 2 datas em texto datilografado

138

Isso funciona em Javascript

new Date()-new Date("2013-02-20T12:01:04.753Z")

Mas, em texto datilografado, não posso descansar duas novas datas

Date("2013-02-20T12:01:04.753Z")

Não funciona porque o paremater não corresponde à assinatura da data

user2025288
fonte

Respostas:

152

Use o getTimemétodo para obter o tempo total em milissegundos desde 01-01 1970 e subtraia aqueles:

var time = new Date().getTime() - new Date("2013-02-20T12:01:04.753Z").getTime();
Guffa
fonte
3
Eu acho que você está misturando getTime () e valueOf (). De acordo com os documentos, getTime () "Obtém o valor do tempo em milissegundos." considerando que é valueOf () que "Retorna o valor do tempo armazenado em milissegundos desde meia-noite de 1 de janeiro de 1970, UTC".
Ken Lyon
Ambos fazem o mesmo:new Date(1970, 1, 1, 0, 0, 0, 0).valueOf() // returns 2674800000 new Date(1970, 1, 1, 0, 0, 0, 0).getTime() // returns 2674800000
prespic
@KenLyon Na documentação do MDN getTime: Você pode usar este método para ajudar a atribuir uma data e hora a outro objeto Date. Este método é funcionalmente equivalente ao método valueOf ().
PhoneixS
29
Uma dica, em vez de usar o new Date().getTime()uso Date.now()para não criar novos objetos desnecessariamente.
PhoneixS
1
@PhoneixS Interessante sobre eles serem equivalentes. Obrigado por me avisar! Além disso, é uma boa dica sobre como evitar a criação de novos objetos.
Ken Lyon
110

É assim que deve ser feito no texto datilografado:

(new Date()).valueOf() - (new Date("2013-02-20T12:01:04.753Z")).valueOf()

Melhor legibilidade:

      var eventStartTime = new Date(event.startTime);
      var eventEndTime = new Date(event.endTime);
      var duration = eventEndTime.valueOf() - eventStartTime.valueOf();
Siddharth Singh
fonte
3
Essa é a abordagem mais correta, pois o javascript está usando "valueOf" internamente ao fazer aritmética em objetos. Datilografado deve ser suficiente inteligente (unfortunataly, ainda não é) para apoiar isso, pois já sabe que o método valueOf para uma data retorna um número, tal como definido no lib.d.ts
Bigjim
1
Curiosamente typescript é tão inteligente agora que mesmo se você não definem eventStartTimee eventEndTimeque a duração fica digitado como um number(ou seja, se você literalmente pegue a terceira linha de código aqui por si só aqui duração será de um número)
Simon_Weaver
22

Não funciona porque Date - Datedepende exatamente do tipo de coerção de tipo que o TypeScript foi projetado para impedir.

Existe uma solução alternativa para isso usando o +prefixo:

var t = Date.now() - +(new Date("2013-02-20T12:01:04.753Z");

Ou, se você preferir não usar Date.now():

var t = +(new Date()) - +(new Date("2013-02-20T12:01:04.753Z"));

Veja a discussão aqui .

Ou veja a resposta de Siddharth Singh, abaixo, para uma solução mais elegante usando valueOf()

Jude Fisher
fonte
1
Aprovar a edição do link porque, devido ao fechamento do CodePlex, a discussão original não está mais disponível no link existente; a menos que haja alguma objeção geral ao uso do web.archive.org, isso não danifica nem desfigura a postagem original de nenhuma maneira, mas preserva seu significado.
Jude Fisher
11

Para calcular a diferença, você deve colocar o +operador,

dessa maneira typescriptconverte as datas em números.

+new Date()- +new Date("2013-02-20T12:01:04.753Z")

A partir daí, você pode fazer uma fórmula para converter a diferença em minutesou hours.

alexalejandroem
fonte
3
// TypeScript

const today = new Date();
const firstDayOfYear = new Date(today.getFullYear(), 0, 1);

// Explicitly convert Date to Number
const pastDaysOfYear = ( Number(today) - Number(firstDayOfYear) );
altergothen
fonte