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.

237voto

Alnitak Points 143355

Il suffit de calculer la différence en secondes (n'oubliez pas que les timestamps JS sont en fait mesurés en millisecondes) et de décomposer cette valeur :

// get total seconds between the times
var delta = Math.abs(date_future - date_now) / 1000;

// calculate (and subtract) whole days
var days = Math.floor(delta / 86400);
delta -= days * 86400;

// calculate (and subtract) whole hours
var hours = Math.floor(delta / 3600) % 24;
delta -= hours * 3600;

// calculate (and subtract) whole minutes
var minutes = Math.floor(delta / 60) % 60;
delta -= minutes * 60;

// what's left is seconds
var seconds = delta % 60;  // in theory the modulus is not required

EDIT Le code a été ajusté car je viens de réaliser que le code original retournait le nombre total d'heures, etc, et non le nombre d'heures restantes après avoir compté des jours entiers.

61voto

yentup Points 2122

Voici en javascript : (Par exemple, la date future est le jour de l'an)

DEMO (mise à jour toutes les secondes)

var dateFuture = new Date(new Date().getFullYear() +1, 0, 1);
var dateNow = new Date();

var seconds = Math.floor((dateFuture - (dateNow))/1000);
var minutes = Math.floor(seconds/60);
var hours = Math.floor(minutes/60);
var days = Math.floor(hours/24);

hours = hours-(days*24);
minutes = minutes-(days*24*60)-(hours*60);
seconds = seconds-(days*24*60*60)-(hours*60*60)-(minutes*60);

48voto

RienNeVaPlus Points 1773

Je l'appelle la "méthode du bonhomme de neige" et je pense qu'elle est un peu plus flexible lorsque vous avez besoin de délais supplémentaires comme semaines, papillons de nuit, années, siècles... et ne veulent pas trop de code répétitif :

var d = Math.abs(date_future - date_now) / 1000;                           // delta
var r = {};                                                                // result
var s = {                                                                  // structure
    year: 31536000,
    month: 2592000,
    week: 604800, // uncomment row to ignore
    day: 86400,   // feel free to add your own row
    hour: 3600,
    minute: 60,
    second: 1
};

Object.keys(s).forEach(function(key){
    r[key] = Math.floor(d / s[key]);
    d -= r[key] * s[key];
});

// for example: {year:0,month:0,week:1,day:2,hour:34,minute:56,second:7}
console.log(r);

Ayez un <strong><a href="https://jsfiddle.net/RienNeVaPlus/vmhguhm3/15/" rel="noreferrer">FIDDLE</a></strong> / <strong><a href="https://jsfiddle.net/RienNeVaPlus/pzw1L47j/1/" rel="noreferrer">ES6 Version (2018)</a></strong> / <strong><a href="https://gist.github.com/RienNeVaPlus/024de3431ae95546d60f2acce128a7e2" rel="noreferrer">TypeScript Version (2019)</a></strong>

Inspiré par Alnitak La réponse de la Commission.

16voto

Christian Meyer Points 56

Une saveur un peu différente (peut-être plus lisible pour certains), il fonctionne en JavaScript et, en prime, il fonctionne en TypeScript también.

Si vous vous assurez que la première date est toujours supérieure à la seconde, vous n'avez pas besoin de Math.abs(). De même, les parenthèses rondes autour de l'opération modulo sont inutiles. Je les ai gardés pour des raisons de clarté.

let diffTime = Math.abs(new Date().valueOf() - new Date('2021-11-22T18:30:00').valueOf());
let days = diffTime / (24*60*60*1000);
let hours = (days % 1) * 24;
let minutes = (hours % 1) * 60;
let secs = (minutes % 1) * 60;
[days, hours, minutes, secs] = [Math.floor(days), Math.floor(hours), Math.floor(minutes), Math.floor(secs)]

console.log(days+'d', hours+'h', minutes+'m', secs+'s');

12voto

CisSasGot Points 159

Ma solution n'est pas aussi claire que cela, mais je l'ai présentée comme un autre exemple.

console.log(duration('2019-07-17T18:35:25.235Z', '2019-07-20T00:37:28.839Z'));

function duration(t0, t1){
    let d = (new Date(t1)) - (new Date(t0));
    let weekdays     = Math.floor(d/1000/60/60/24/7);
    let days         = Math.floor(d/1000/60/60/24 - weekdays*7);
    let hours        = Math.floor(d/1000/60/60    - weekdays*7*24            - days*24);
    let minutes      = Math.floor(d/1000/60       - weekdays*7*24*60         - days*24*60         - hours*60);
    let seconds      = Math.floor(d/1000          - weekdays*7*24*60*60      - days*24*60*60      - hours*60*60      - minutes*60);
    let milliseconds = Math.floor(d               - weekdays*7*24*60*60*1000 - days*24*60*60*1000 - hours*60*60*1000 - minutes*60*1000 - seconds*1000);
    let t = {};
    ['weekdays', 'days', 'hours', 'minutes', 'seconds', 'milliseconds'].forEach(q=>{ if (eval(q)>0) { t[q] = eval(q); } });
    return t;
}

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