¿Cómo puedo calcular el tiempo entre 2 fechas en mecanografiado

138

Esto funciona en Javascript

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

Pero en mecanografiado no puedo descansar dos nuevas fechas

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

No funciona porque paremater no coincide con la firma de fecha

usuario2025288
fuente

Respuestas:

152

Use el getTimemétodo para obtener el tiempo en milisegundos totales desde 1970-01-01, y reste esos:

var time = new Date().getTime() - new Date("2013-02-20T12:01:04.753Z").getTime();
Guffa
fuente
3
Creo que estás mezclando getTime () y valueOf (). Según los documentos, getTime () "Obtiene el valor del tiempo en milisegundos". mientras que es valueOf () que "Devuelve el valor del tiempo almacenado en milisegundos desde la medianoche del 1 de enero de 1970 UTC".
Ken Lyon
Tanto hacer lo mismo: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 De la documentación de MDN getTime: puede usar este método para ayudar a asignar una fecha y hora a otro objeto Date. Este método es funcionalmente equivalente al método valueOf ().
PhoneixS
29
Un consejo, en lugar de usar el new Date().getTime()uso Date.now()para no crear objetos nuevos innecesariamente
PhoneixS
1
@PhoneixS Interesante acerca de que sean equivalentes. ¡Gracias por hacérmelo saber! Además, es un buen consejo para evitar crear nuevos objetos.
Ken Lyon
110

Así es como debe hacerse en mecanografiado:

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

Mejor legibilidad:

      var eventStartTime = new Date(event.startTime);
      var eventEndTime = new Date(event.endTime);
      var duration = eventEndTime.valueOf() - eventStartTime.valueOf();
Siddharth Singh
fuente
3
Este es el enfoque más correcto, ya que JavaScript está usando "valueOf" internamente al hacer aritmética en objetos. El mecanografiado debería ser lo suficientemente inteligente (desafortunadamente, todavía no lo es) para admitir esto, ya que ya sabe que el método valueOf para una fecha devuelve un número como se define en lib.d.ts
Bigjim
1
Curiosamente, el texto mecanografiado es tan inteligente ahora que incluso si no define eventStartTimey eventEndTimeesa duración se escribe como number(es decir, si literalmente toma la tercera línea de código aquí solo, la duración será un número)
Simon_Weaver
22

No funciona porque se Date - Datebasa exactamente en el tipo de coerción de tipo que TypeScript está diseñado para prevenir.

Hay una solución alternativa para esto usando el +prefijo:

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

O, si prefiere no usar Date.now():

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

Ver discusión aquí .

O vea la respuesta de Siddharth Singh, a continuación, para una solución más elegante usando valueOf()

Jude Fisher
fuente
1
Aprobar la edición del enlace porque, debido al cierre de CodePlex, la discusión original ya no está disponible en el enlace existente; a menos que haya alguna objeción general al uso de web.archive.org, esto no daña ni daña la publicación original de ninguna manera, sino que conserva su significado.
Jude Fisher
11

Para calcular la diferencia tienes que poner el +operador,

de esa manera typescriptconvierte las fechas en números.

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

Desde allí, puede hacer una fórmula para convertir la diferencia en minuteso hours.

alexalejandroem
fuente
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
fuente