Obtenez le décalage horaire entre deux dates en secondes


149

J'essaie d'obtenir une différence entre deux dates en quelques secondes. La logique serait comme ceci:

  • fixer une date initiale qui serait maintenant;
  • définir une date finale qui serait la date initiale plus un certain nombre de secondes dans le futur (disons 15 par exemple)
  • obtenir la différence entre ces deux (le nombre de secondes)

La raison pour laquelle je le fais avec des dates c'est parce que la date / heure finale dépend de certaines autres variables et ce n'est jamais la même chose (cela dépend de la vitesse à laquelle un utilisateur fait quelque chose) et je stocke également la date initiale pour d'autres choses.

J'ai essayé quelque chose comme ça:

var _initial = new Date(),
    _initial = _initial.setDate(_initial.getDate()),
    _final = new Date(_initial);
    _final = _final.setDate(_final.getDate() + 15 / 1000 * 60);

var dif = Math.round((_final - _initial) / (1000 * 60));

Le truc, c'est que je n'ai jamais la bonne différence. J'ai essayé de diviser par 24 * 60ce qui me laisserait les secondes, mais je n'ai jamais bien compris. Alors, quel est le problème avec ma logique? Je fais peut-être une erreur stupide car il est assez tard, mais cela me dérange de ne pas pouvoir le faire fonctionner :)


2
L'ordre des opérations est essentiel.
Dylan Cross

1
Vous aimeriez donc avoir un horodatage, ajouter 15 secondes, puis voir quelle est la différence en secondes. Je dirais qu'il y a de fortes chances que la différence soit ... attendez ... 15 secondes?
adeneo


1
Je comprends vraiment ce que vous essayez de faire (je pense), mais si vous prenez new Date (), qui est l'heure unix en ce moment, ajoutez 15 secondes et vérifiez tout de suite la différence, la différence sera de 15 secondes (moins les millisecondes qu'il a fallu pour calculer), mais je suppose que votre intention est de comparer cela à l'avenir d'une manière ou d'une autre.
adeneo

1
Je ne comprends pas vraiment, pour prouver mon point, voici un FIDDLE fonctionnel pour votre exemple ci-dessus. Si vous essayez de déterminer combien de temps l'utilisateur a mis pour faire quelque chose, vous obtenez généralement l'horodatage lorsque l'utilisateur démarre l'opération, et l'horodatage lorsque l'utilisateur a terminé l'opération, et comparez-les, et vous savez combien de temps cela a pris . À quoi servent les 15 secondes?
adeneo

Réponses:


283

Le code

var startDate = new Date();
// Do your operations
var endDate   = new Date();
var seconds = (endDate.getTime() - startDate.getTime()) / 1000;

Ou encore plus simple (endDate - startDate) / 1000comme indiqué dans les commentaires, sauf si vous utilisez du dactylographie.


L'explication

Vous devez appeler la getTime()méthode pour les Dateobjets, puis simplement les soustraire et les diviser par 1000 (car c'est à l'origine en millisecondes). De plus, lorsque vous appelez la getDate()méthode, vous obtenez en fait le jour du mois sous la forme d'un entier compris entre 1 et 31 (non basé sur zéro) par opposition à l'heure que vous obtiendrez en appelant la getTime()méthode, représentant le nombre de millisecondes depuis le 1er janvier 1970, 00:00


Rant

En fonction de vos opérations liées à la date, vous voudrez peut-être investir dans l'intégration d'une bibliothèque telle que date.js ou moment.js, qui facilitent tellement les choses pour le développeur, mais ce n'est qu'une question de préférence personnelle.

Par exemple dans moment.js nous ferions ce moment1.diff(moment2, "seconds")qui est beau.


Documents utiles pour cette réponse


15
Il n'y a pas besoin de getTIme , les dates peuvent être soustraites les unes des autres car l' opérateur - les contraindra à devenir des nombres.
RobG

3
getTime est nécessaire si vous utilisez un script dactylographié, il n'autorise pas les opérations arithmétiques entre des éléments autres que any, number ou enum
zaffaste

Vous pouvez utiliser .valueOf(), ce que l' -opérateur appellerait dans tous les cas ...
Heretic Monkey

1
Que diriez-vous si nous avons également besoin des différences d'heure / minute ...? Dois-je le diviser par 60 ou plusieurs de celui-ci ... @Juan
gumuruh

Veuillez ajouter de nouveaux doutes en tant que questions individuelles, mais comme celle-ci serait probablement fermée en double, jetez un œil ici stackoverflow.com/questions/1322732/…
Juan Cortés

5

Vous pouvez utiliser new Date().getTime()pour obtenir des horodatages. Ensuite, vous pouvez calculer la différence entre la fin et le début et enfin transformer l'horodatage msen s.

const start = new Date().getTime();
const end = new Date().getTime();

const diff = end - start;
const seconds = Math.floor(diff / 1000 % 60);

4
<script type="text/javascript">
var _initial = '2015-05-21T10:17:28.593Z';
var fromTime = new Date(_initial);
var toTime = new Date();

var differenceTravel = toTime.getTime() - fromTime.getTime();
var seconds = Math.floor((differenceTravel) / (1000));
document.write('+ seconds +');
</script>

1

Le code ci-dessous donnera le décalage horaire en seconde.

var date1 = new Date(); // current date
var date2 = new Date("06/26/2018"); // mm/dd/yyyy format
var timeDiff = Math.abs(date2.getTime() - date1.getTime()); // in miliseconds
var timeDiffInSecond = Math.ceil(timeDiff / 1000); // in second

alert(timeDiffInSecond );

0

essayez d'utiliser les fonctions dédiées des langages de programmation de haut niveau. JavaScript .getSeconds();convient ici:

var specifiedTime = new Date("November 02, 2017 06:00:00");
var specifiedTimeSeconds = specifiedTime.getSeconds(); 

var currentTime = new Date();
var currentTimeSeconds = currentTime.getSeconds(); 

alert(specifiedTimeSeconds-currentTimeSeconds);

0

décalage horaire entre maintenant et 10 minutes plus tard en utilisant momentjs

let start_time = moment().format('YYYY-MM-DD HH:mm:ss');
let next_time = moment().add(10, 'm').format('YYYY-MM-DD HH:mm:ss');

let diff_milliseconds = Date.parse(next_time) - Date.parse(star_time);
let diff_seconds = diff_milliseconds * 1000;
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.