Comment puis-je calculer le temps entre 2 dates en tapuscrit

138

Cela fonctionne en Javascript

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

Mais en tapuscrit, je ne peux pas me reposer deux nouvelles dates

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

Ne fonctionne pas car le paramètre ne correspond pas à la signature de la date

user2025288
la source

Réponses:

152

Utilisez la getTimeméthode pour obtenir le temps en millisecondes total depuis le 01/01/1970 et soustrayez-les:

var time = new Date().getTime() - new Date("2013-02-20T12:01:04.753Z").getTime();
Guffa
la source
3
Je pense que vous mélangez getTime () et valueOf (). Selon la documentation, getTime () "Obtient la valeur de temps en millisecondes." alors que c'est valueOf () qui "Renvoie la valeur de temps stockée en millisecondes depuis minuit, le 1er janvier 1970 UTC."
Ken Lyon
Les deux font de même:new Date(1970, 1, 1, 0, 0, 0, 0).valueOf() // returns 2674800000 new Date(1970, 1, 1, 0, 0, 0, 0).getTime() // returns 2674800000
avant
@KenLyon De la documentation MDN getTime: Vous pouvez utiliser cette méthode pour aider à attribuer une date et une heure à un autre objet Date. Cette méthode est fonctionnellement équivalente à la méthode valueOf ().
PhoneixS
29
Une astuce, au lieu d'utiliser new Date().getTime()use Date.now()pour ne pas créer de nouveaux objets inutilement.
PhoneixS
1
@PhoneixS Intéressant qu'ils soient équivalents. Merci de me le faire savoir! C'est également un bon conseil pour éviter de créer de nouveaux objets.
Ken Lyon
110

Voici comment cela doit être fait en tapuscrit:

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

Meilleure lisibilité:

      var eventStartTime = new Date(event.startTime);
      var eventEndTime = new Date(event.endTime);
      var duration = eventEndTime.valueOf() - eventStartTime.valueOf();
Siddharth Singh
la source
4
C'est l'approche la plus correcte, car javascript utilise "valueOf" en interne lors de l'exécution d'arithmétique sur des objets. Le typographie devrait être suffisamment intelligent (malheureusement, ce n'est pas encore le cas) pour le supporter car il sait déjà que la méthode valueOf pour une date renvoie un nombre tel que défini dans lib.d.ts
Bigjim
1
Fait intéressant, le typographie est si intelligent maintenant que même si vous ne définissez pas eventStartTimeet eventEndTimeque la durée est tapée comme un number(ce qui signifie que si vous prenez littéralement la troisième ligne de code ici seule, la durée sera un nombre)
Simon_Weaver
22

Cela ne fonctionne pas car Date - Datedépend exactement du type de coercition de type que TypeScript est conçu pour empêcher.

Il existe une solution de contournement en utilisant le +préfixe:

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

Ou, si vous préférez ne pas utiliser Date.now():

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

Voir la discussion ici .

Ou voir la réponse de Siddharth Singh, ci-dessous, pour une solution plus élégante utilisant valueOf()

Jude Fisher
la source
1
Approuver la modification du lien car, en raison de la fermeture de CodePlex, la discussion originale n'est plus disponible sur le lien existant; à moins qu'il y ait une objection générale à l'utilisation de web.archive.org, cela n'endommage ni ne dégrade en aucune façon le message d'origine, mais préserve plutôt sa signification.
Jude Fisher
11

Afin de calculer la différence, vous devez mettre l' +opérateur,

de cette façon typescriptconvertit les dates en nombres.

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

À partir de là, vous pouvez créer une formule pour convertir la différence en minutesou hours.

alexalejandroem
la source
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
la source