102 votes

Javascript retourne le nombre de jours, heures, minutes, secondes entre deux dates

Est-ce que quelqu'un peut m'indiquer un tutoriel où je peux trouver comment retourner les jours, heures, minutes, secondes en javascript entre 2 dates unix ?

Je l'ai fait :

var date_now = unixtimestamp;
var date_future = unixtimestamp;

Je voudrais savoir (en direct) combien de jours, d'heures, de minutes, de secondes il reste de la date_maintenant à la date_futur.

11voto

csg Points 622

Veuillez noter que le calcul basé uniquement sur les différences ne couvre pas tous les cas : années bissextiles et passage à l'heure d'été.

Javascript dispose d'une bibliothèque intégrée médiocre pour travailler avec les dates. Je vous suggère d'utiliser une bibliothèque javascript tierce, par exemple MomentJS ; vous pouvez voir ici la fonction que vous recherchiez.

7voto

ns16 Points 415

Utilice moment.js la bibliothèque, par exemple :

var time = date_future - date_now;
var seconds = moment.duration(time).seconds();
var minutes = moment.duration(time).minutes();
var hours   = moment.duration(time).hours();
var days    = moment.duration(time).days();

7voto

Aperçu Points 5245

Comme MomentJS est assez lourd et sous-optimisé, les personnes qui n'ont pas peur d'utiliser un module devraient probablement se tourner vers date-fns à la place, qui fournit un intervalToDuration qui fait ce que vous voulez :

const result = intervalToDuration({
  start: new Date(dateNow),
  end: new Date(dateFuture),
})

Et qui renverrait un objet ressemblant à ceci :

{
  years: 39,
  months: 2,
  days: 20,
  hours: 7,
  minutes: 5,
  seconds: 0,
}

Alors vous pouvez même utiliser formatDuration pour afficher cet objet comme une chaîne de caractères en utilisant les paramètres que vous préférez

6voto

Sceptic Points 1639

Voici un exemple de code. J'ai utilisé des calculs simples au lieu d'utiliser des précalculs comme 1 jour est 86400 secondes. Ainsi vous pouvez suivre la logique avec facilité.

// Calculate time between two dates:
var date1 = new Date('1110-01-01 11:10');
var date2 = new Date();

console.log('difference in ms', date1 - date2);

// Use Math.abs() so the order of the dates can be ignored and you won't
// end up with negative numbers when date1 is before date2.
console.log('difference in ms abs', Math.abs(date1 - date2));
console.log('difference in seconds', Math.abs(date1 - date2) / 1000);

var diffInSeconds = Math.abs(date1 - date2) / 1000;
var days = Math.floor(diffInSeconds / 60 / 60 / 24);
var hours = Math.floor(diffInSeconds / 60 / 60 % 24);
var minutes = Math.floor(diffInSeconds / 60 % 60);
var seconds = Math.floor(diffInSeconds % 60);
var milliseconds = Math.round((diffInSeconds - Math.floor(diffInSeconds)) * 1000);

console.log('days', days);
console.log('hours', ('0' + hours).slice(-2));
console.log('minutes', ('0' + minutes).slice(-2));
console.log('seconds', ('0' + seconds).slice(-2));
console.log('milliseconds', ('00' + milliseconds).slice(-3));

6voto

klerik Points 385

Court et flexible, avec prise en charge des valeurs négatives mais en utilisant deux expressions à virgule :)

function timeUnitsBetween(startDate, endDate) {
  let delta = Math.abs(endDate - startDate) / 1000;
  const isNegative = startDate > endDate ? -1 : 1;
  return [
    ['days', 24 * 60 * 60],
    ['hours', 60 * 60],
    ['minutes', 60],
    ['seconds', 1]
  ].reduce((acc, [key, value]) => (acc[key] = Math.floor(delta / value) * isNegative, delta -= acc[key] * isNegative * value, acc), {});
}

Exemple :

timeUnitsBetween(new Date("2019-02-11T02:12:03+00:00"), new Date("2019-02-11T01:00:00+00:00"));
// { days: -0, hours: -1, minutes: -12, seconds: -3 }

Inspiré par RienNeVaPlus solution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X