286 votes

Obtenir la différence de temps entre deux dates

Je sais que je peux faire n'importe quoi et d'autres choses concernant les dates avec momentjs. Mais malheureusement, j'ai du mal à faire quelque chose qui semble simple : obtenir la différence entre 2 temps.

Exemple :

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";

//expected result:
"00:39:30"

ce que j'ai essayé :

var now = moment("04/09/2013 15:00:00");
var then = moment("04/09/2013 14:20:30");

console.log(moment(moment.duration(now.diff(then))).format("hh:mm:ss"))
//outputs 10:39:30  

Je ne comprends pas ce qu'est ce "10". Je vis au Brésil, nous sommes donc en utc-0300 si cela est pertinent.

Le résultat de moment.duration(now.diff(then)) est une durée avec les valeurs internes correctes :

 days: 0
 hours: 0
 milliseconds: 0
 minutes: 39
 months: 0
 seconds: 30
 years: 0

Ma question est donc la suivante : comment convertir un momentjs Duration en un intervalle de temps ? Je peux bien sûr utiliser

duration.get("hours") +":"+ duration.get("minutes") +:+ duration.get("seconds")

mais j'ai le sentiment qu'il y a quelque chose de plus élégant qui m'échappe complètement.

mise à jour
En y regardant de plus près, dans l'exemple ci-dessus now est :

Tue Apr 09 2013 15:00:00 GMT-0300 (E. South America Standard Time)…}

y moment(moment.duration(now.diff(then))) est :

Wed Dec 31 1969 22:39:30 GMT-0200 (E. South America Daylight Time)…}

Je ne sais pas pourquoi la deuxième valeur est en heure d'été (-0200)... mais je suis sûr que je n'aime pas les dates :(

mise à jour 2

Eh bien, la valeur est -0200 probablement parce que le 31/12/1969 était une date où l'on utilisait l'heure d'été... c'est donc ça.

2voto

Dans ES8, les objets moment, now et start sont des objets moment.

const duration = moment.duration(now.diff(start));
const timespan = duration.get("hours").toString().padStart(2, '0') +":"+ duration.get("minutes").toString().padStart(2, '0') +":"+ duration.get("seconds").toString().padStart(2, '0');

2voto

skantus Points 621

Tapuscrit : devrait fonctionner,

export const getTimeBetweenDates = ({
  until,
  format
}: {
  until: number;
  format: 'seconds' | 'minutes' | 'hours' | 'days';
}): number => {
  const date = new Date();
  const remainingTime = new Date(until * 1000);
  const getFrom = moment([date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()]);
  const getUntil = moment([remainingTime.getUTCFullYear(), remainingTime.getUTCMonth(), remainingTime.getUTCDate()]);
  const diff = getUntil.diff(getFrom, format);
  return !isNaN(diff) ? diff : null;
};

1voto

Anandan K Points 67

ENTRÉE BASÉE SUR LA DATE ET L'HEURE

    var dt1 = new Date("2019-1-8 11:19:16");
    var dt2 = new Date("2019-1-8 11:24:16");

    var diff =(dt2.getTime() - dt1.getTime()) ;
    var hours = Math.floor(diff / (1000 * 60 * 60));
    diff -= hours * (1000 * 60 * 60);
    var mins = Math.floor(diff / (1000 * 60));
    diff -= mins * (1000 * 60);

    var response = {
        status : 200,
        Hour : hours,
        Mins : mins
    }

SORTIE

{
"status": 200,
"Hour": 0,
"Mins": 5
}

1voto

L'approche suivante est valable pour tous les cas (différence entre les dates inférieure à 24 heures et différence supérieure à 24 heures) :

// Defining start and end variables
let start = moment('04/09/2013 15:00:00', 'DD/MM/YYYY hh:mm:ss');
let end   = moment('04/09/2013 14:20:30', 'DD/MM/YYYY hh:mm:ss');

// Getting the difference: hours (h), minutes (m) and seconds (s)
let h  = end.diff(start, 'hours');
let m  = end.diff(start, 'minutes') - (60 * h);
let s  = end.diff(start, 'seconds') - (60 * 60 * h) - (60 * m);

// Formating in hh:mm:ss (appends a left zero when num < 10)
let hh = ('0' + h).slice(-2);
let mm = ('0' + m).slice(-2);
let ss = ('0' + s).slice(-2);

console.log(`${hh}:${mm}:${ss}`); // 00:39:30

1voto

Dương Đạt Points 1

Cela renvoie la plus grande période de temps possible (4 secondes, 2 minutes, 1 heure, 2 jours, 3 semaines, 4 mois, 5 ans). Je l'utilise pour les notifications récentes.

function dateDiff(startDate, endDate) {
    let arrDate = ["seconds", "minutes", "hours", "days", "weeks", "months", "years"];
    let dateMap = arrDate.map(e => moment(endDate).diff(startDate, e));
    let index = 6 - dateMap.filter(e => e == 0).length;
    return {
        type: arrDate[index] ?? "seconds",
        value: dateMap[index] ?? 0
    };
}

Exemple :

dateDiff("2021-06-09 01:00:00", "2021-06-09 04:01:01")

{type: "hours", value: 3}

dateDiff("2021-06-09 01:00:00", "2021-06-12 04:01:01")

{type: "days", value: 3}

dateDiff("2021-06-09 01:00:00", "2021-06-09 01:00:10")

{type: "seconds", value: 10}

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