Obtenez le décalage horaire entre deux heures


246

Je sais que je peux faire n'importe quoi et quelques dates plus envoûtantes avec momentjs. Mais embarrassant, j'ai du mal à essayer de faire quelque chose qui semble simple: faire la différence entre 2 fois.

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 que c'est que "10" là-bas. J'habite au Brésil, nous sommes donc 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

Donc, je suppose que ma question est: comment convertir une durée momentjs en un intervalle de temps? Je peux certainement utiliser

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

mais je sens qu'il y a quelque chose de plus élégant qui me manque complètement.

mise
à jour en regardant de plus près, dans l'exemple ci-dessus nowest:

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

et moment(moment.duration(now.diff(then)))c'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'heure d'été était utilisée ... c'est donc ça.


2
"mais je suis sûr que je n'aime pas les dates": P Avez-vous déjà lu ceci: nodatime.org/unstable/userguide/trivia.html ?
Boris Callens

Réponses:


367

Cette approche fonctionnera UNIQUEMENT lorsque la durée totale est inférieure à 24 heures:

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

moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss")

// outputs: "00:39:30"

Si vous avez 24 heures ou plus, les heures seront remises à zéro avec l'approche ci-dessus, donc ce n'est pas idéal.

Si vous souhaitez obtenir une réponse valide pour des durées de 24 heures ou plus, vous devrez alors faire quelque chose comme ceci:

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

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
var s = Math.floor(d.asHours()) + moment.utc(ms).format(":mm:ss");

// outputs: "48:39:30"

Notez que j'utilise le temps utc comme raccourci. Vous pourriez vous retirer d.minutes()etd.seconds() séparer, mais vous devrez également les zéros.

Cela est nécessaire car la possibilité de formater une durationobjection n'est pas actuellement dans moment.js. Il a été demandé ici . Cependant, il existe un plugin tiers appelé moment-duration-format qui est spécifiquement conçu à cet effet:

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

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
var s = d.format("hh:mm:ss");

// outputs: "48:39:30"

31
@TML - J'ai clairement dit que cela ne fonctionnerait pas pendant 24 heures ou plus.
Matt Johnson-Pint

1
Cela a bien fonctionné. momentjs est une bibliothèque tellement élégante qu'elle me surprend qu'elle n'a pas de méthode plus simple mais peut-être que ce que je fais n'est pas si "normal". Je n'aurais probablement pas plus de 24 heures mais c'est bien d'avoir la possibilité si cela se produit. Merci de votre aide.
Leo

69

Votre problème consiste à transmettre le résultat de moment.duration () à moment () avant de le formater; il en résulte que moment () l'interprète comme un temps par rapport à l'époque Unix.

Il ne vous donne pas exactement le format que vous recherchez, mais

moment.duration(now.diff(then)).humanize()

vous donnerait un format utile comme "40 minutes". Si vous aimez vraiment cette mise en forme spécifique, vous devrez créer vous-même une nouvelle chaîne. Un moyen bon marché serait

[diff.asHours(), diff.minutes(), diff.seconds()].join(':')

var diff = moment.duration(now.diff(then)). Cela ne vous donne pas le zéro pour les valeurs à un chiffre. Pour cela, vous voudrez peut-être envisager quelque chose comme underscore.string - bien que cela semble être un long chemin à parcourir juste pour quelques zéros supplémentaires. :)


4
vous devrez utiliser asHoursau lieu de hourset retirer les décimales. Sinon, il y aurait le même problème que vous avez attrapé dans ma réponse. :)
Matt Johnson-Pint

humanize () donne une belle touche mais j'ai fini par utiliser la suggestion de Matt. Merci pour le conseil.
Leo

Merci d'avoir souligné cela, @MattJohnson - Je n'avais même pas réalisé que .asHours et .hours étaient différents, pensant que l'un était juste un nom plus court pour l'autre, mais en y regardant de plus près, vous avez raison.
TML

2
Remarque, il serait judicieux d'utiliser: [Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')afin d'obtenir le résultat souhaité. sans décimale dans la première partie
KyleM


30

Si vous voulez une différence de deux horodatages en jours, heures et minutes uniquement, pas en mois ni en années.

var now  = "01/08/2016 15:00:00";
var then = "04/02/2016 14:20:30";
var diff = moment.duration(moment(then).diff(moment(now)));

diff contient 2 mois, 23 jours, 23 heures et 20 minutes. Mais nous avons besoin de résultats uniquement en jours, heures et minutes, donc la solution simple est:

var days = parseInt(diff.asDays()); //84

var hours = parseInt(diff.asHours()); //2039 hours, but it gives total hours in given miliseconds which is not expacted.

hours = hours - days*24;  // 23 hours

var minutes = parseInt(diff.asMinutes()); //122360 minutes,but it gives total minutes in given miliseconds which is not expacted.

minutes = minutes - (days*24*60 + hours*60); //20 minutes.

Le résultat final sera: 84 jours, 23 heures, 20 minutes.


19

Lorsque vous appelez diff, moment.js calcule la différence en millisecondes. Si les millisecondes sont passées à duration, il est utilisé pour calculer la durée qui est correcte. Toutefois. lorsque vous passez les mêmes millisecondes au moment(), il calcule la date qui est en millisecondes à partir de (après) l'heure epoch / unix qui est le 1er janvier 1970 (minuit UTC / GMT). C'est pourquoi vous obtenez 1969 comme l'année avec la mauvaise heure.

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

Donc, je pense que c'est comme ça que vous devriez le faire car moment.js n'offre pas de formatfonction pour la durée. Ou vous pouvez écrire un simple wrapper pour le rendre plus facile / plus joli.


11

Cela devrait bien fonctionner.

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

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);

console.log(d.days(), d.hours(), d.minutes(), d.seconds());

Meilleure solution! :)
JHenry

Meilleure solution de tous les temps
Alaksandar Jesus Gene

9

Si nous voulons seulement hh: mm: ss, nous pouvons utiliser une fonction comme celle-ci:

//param: duration in milliseconds
MillisecondsToTime: function(duration) {
    var seconds = parseInt((duration/1000)%60)
        , minutes = parseInt((duration/(1000*60))%60)
        , hours = parseInt((duration/(1000*60*60))%24)
        , days  = parseInt(duration/(1000*60*60*24));

    var hoursDays = parseInt(days*24);
    hours += hoursDays;
    hours = (hours < 10) ? "0" + hours : hours;
    minutes = (minutes < 10) ? "0" + minutes : minutes;
    seconds = (seconds < 10) ? "0" + seconds : seconds;
    return hours + ":" + minutes + ":" + seconds;
}

4
Je ne vois aucune utilisation du moment nulle part dans votre réponse.
Joel

4

Utilisez ceci,

  var duration = moment.duration(endDate.diff(startDate));

    var aa = duration.asHours();

3

Au lieu de

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Il vaut mieux faire

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

2

Dans ES8, utilisez moment, now et commencez à être 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');

2

Typographie: ce qui suit 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;
};

0

Je crée une fonction simple avec tapuscrit

const diffDuration: moment.Duration = moment.duration(moment('2017-09-04 12:55').diff(moment('2017-09-02 13:26')));
setDiffTimeString(diffDuration);

function setDiffTimeString(diffDuration: moment.Duration) {
  const str = [];
  diffDuration.years() > 0 ? str.push(`${diffDuration.years()} year(s)`) : null;
  diffDuration.months() > 0 ? str.push(`${diffDuration.months()} month(s)`) : null;
  diffDuration.days() > 0 ? str.push(`${diffDuration.days()} day(s)`) : null;
  diffDuration.hours() > 0 ? str.push(`${diffDuration.hours()} hour(s)`) : null;
  diffDuration.minutes() > 0 ? str.push(`${diffDuration.minutes()} minute(s)`) : null;
  console.log(str.join(', '));
} 
// output: 1 day(s), 23 hour(s), 29 minute(s)

pour générer javascript https://www.typescriptlang.org/play/index.html


0

InTime = 06: 38, Outtime = 15: 40

 calTimeDifference(){
        this.start = dailyattendance.InTime.split(":");
        this.end = dailyattendance.OutTime.split(":");
        var time1 = ((parseInt(this.start[0]) * 60) + parseInt(this.start[1]))
        var time2 = ((parseInt(this.end[0]) * 60) + parseInt(this.end[1]));
        var time3 = ((time2 - time1) / 60);
        var timeHr = parseInt(""+time3);
        var  timeMin = ((time2 - time1) % 60);
    }

0

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

    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
    }

PRODUCTION

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

0

DIFFÉRENCE DE TEMPS EPOCH À L'AIDE DE MOMENTJS :

Pour obtenir la différence entre deux époques:

Syntaxe: moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()

Différence d'heures: moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()

Différence en minutes: moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()

Remarque: Vous pouvez supprimer .toFixed()si vous avez besoin de valeurs précises.

Code:

const moment = require('moment')

console.log('Date 1',moment(1590597909877).toISOString())
console.log('Date 2',moment(1590597744551).toISOString())
console.log('Date1 - Date 2 time diffrence is : ',moment.duration(moment(moment(1590597909877).diff(moment(1590597744551)))).asMinutes().toFixed()+' minutes')

Reportez-vous à l'exemple de travail ici: https://repl.it/repls/MoccasinDearDimension

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.