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

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

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

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()


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.


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) );
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.