Come posso calcolare il tempo tra 2 Date in dattiloscritto


138

Questo funziona in Javascript

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

Ma in dattiloscritto non posso riposare due nuove date

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

Non funziona perché paremater non corrisponde alla firma della data

Risposte:


152

Utilizzare il getTimemetodo per ottenere il tempo in millisecondi totali dal 1970-01-01 e sottrarre quelli:

var time = new Date().getTime() - new Date("2013-02-20T12:01:04.753Z").getTime();

3
Penso che stai mescolando getTime () e valueOf (). Secondo i documenti, getTime () "Ottiene il valore del tempo in millisecondi." mentre è valueOf () che "Restituisce il valore del tempo memorizzato in millisecondi dalla mezzanotte del 1 gennaio 1970 UTC."
Ken Lyon,

Entrambi fanno lo stesso:new Date(1970, 1, 1, 0, 0, 0, 0).valueOf() // returns 2674800000 new Date(1970, 1, 1, 0, 0, 0, 0).getTime() // returns 2674800000
prespico

@KenLyon Dalla documentazione di MDN getTime: è possibile utilizzare questo metodo per assegnare una data e un'ora a un altro oggetto Date. Questo metodo è funzionalmente equivalente al metodo valueOf ().
PhoneixS

29
Un consiglio, invece di usare l' new Date().getTime()uso in Date.now()modo da non creare nuovi oggetti inutilmente.
PhoneixS

1
@PhoneixS Interessante che siano equivalenti. Grazie per avermi fatto sapere! Inoltre, questo è un buon consiglio per evitare di creare nuovi oggetti.
Ken Lyon

110

Ecco come dovrebbe essere fatto in dattiloscritto:

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

Migliore leggibilità:

      var eventStartTime = new Date(event.startTime);
      var eventEndTime = new Date(event.endTime);
      var duration = eventEndTime.valueOf() - eventStartTime.valueOf();

4
Questo è l'approccio più corretto, dal momento che JavaScript utilizza "valueOf" internamente quando si esegue l'aritmetica sugli oggetti. Il dattiloscritto dovrebbe essere abbastanza intelligente (sfortunatamente, non è ancora) per supportarlo poiché sa già che il metodo valueOf per una data restituisce un numero come definito in lib.d.ts
Bigjim

1
È interessante notare che il dattiloscritto è così intelligente ora che anche se non lo definisci eventStartTimee eventEndTimequella durata viene digitata come un number(il che significa che se prendi letteralmente la terza riga di codice qui da sola qui la durata sarà un numero)
Simon_Weaver

22

Non funziona perché Date - Datesi basa esattamente sul tipo di coercizione del tipo che TypeScript è progettato per impedire.

C'è una soluzione alternativa usando il +prefisso:

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

Oppure, se preferisci non usare Date.now():

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

Vedi la discussione qui .

O vedi la risposta di Siddharth Singh, sotto, per una soluzione più elegante usando valueOf()


1
Approvare la modifica del collegamento perché, a causa della chiusura di CodePlex, la discussione originale non è più disponibile sul collegamento esistente; a meno che non ci siano obiezioni generalizzate sull'uso di web.archive.org, ciò non danneggia o deturpa il post originale in alcun modo, ma ne conserva piuttosto il significato.
Jude Fisher,

11

Per calcolare la differenza devi inserire l' +operatore,

in questo modo typescriptconverte le date in numeri.

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

Da lì puoi creare una formula per convertire la differenza in minuteso hours.


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) );
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.