Je sais que je peux faire n'importe quoi et quelques dates plus envolantes avec des moments. Mais, embarrassant, j'ai de la difficulté à essayer de faire quelque chose qui semble simple: faire la différence entre deux 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 qu'est ce "10" là. Je vis 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 en un intervalle de temps? Je peux bien sûr utiliser
duration.get("hours") +":"+ duration.get("minutes") +:+ duration.get("seconds")
mais j'estime qu'il y a quelque chose de plus élégant qui me manque complètement.
mettre à jour
en 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)…}
et 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 avancée (-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 à laquelle l’heure était utilisée ... alors c’est tout.
Cette approche fonctionnera UNIQUEMENT si 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.
Si vous souhaitez obtenir une réponse valide pour une durée de 24 heures ou plus,}, vous devrez alors procéder de la manière suivante:
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 l'heure utc comme raccourci. Vous pouvez extraire d.minutes()
et d.seconds()
séparément, mais vous devez également les zéros.
Cela est nécessaire car la possibilité de formater une objection duration
n'est pas actuellement dans moment.js. Il a été demandé ici . Cependant, il existe un plug-in tiers appelé moment-durée-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"
Votre problème est de faire passer le résultat de moment.duration () dans moment () avant de le formater; il en résulte que moment () l'interprète comme une heure relative à 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 êtes vraiment intéressé par ce formatage spécifique, vous devrez créer vous-même une nouvelle chaîne. Un moyen peu coûteux serait
[diff.asHours(), diff.minutes(), diff.seconds()].join(':')
où var diff = moment.duration(now.diff(then))
. Cela ne vous donne pas le zéro-remplissage sur les valeurs à un chiffre. Pour cela, vous voudrez peut-être envisager quelque chose comme nderscore.string - bien que cela puisse sembler être un long chemin à parcourir, pour quelques zéros supplémentaires. :)
var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') //[days, years, months, seconds, ...]
//Result 1
Travaillé pour moi
Voir plus in http://momentjs.com/docs/#/displaying/difference/
Si vous souhaitez une différence de deux horodatages en nombre total de jours, heures et minutes, et non en mois et 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 n'avons besoin que de résultats en jours, heures et minutes. La solution simple est donc:
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 et 20 minutes.
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 . Cependant. lorsque vous passez les mêmes millisecondes à la moment()
, il calcule la date en millisecondes à partir de (après) l'époque Epoch/unix qui est le 1er janvier 1970 (à minuit UTC/GMT) . C'est pourquoi vous obtenez 1969 comme année avec mauvaise heure.
duration.get("hours") +":"+ duration.get("minutes") +":"+ duration.get("seconds")
Donc, je pense que c'est comme cela que vous devriez le faire puisque moment.js n'offre pas de fonction format
pour la durée. Ou vous pouvez écrire un simple emballage pour le rendre plus facile/plus joli.
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;
}
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());
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");
Utilisez ceci,
var duration = moment.duration(endDate.diff(startDate));
var aa = duration.asHours();
ENTREE BASEE SUR 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
}
SORTIE
{
"status": 200,
"Hour": 0,
"Mins": 5
}
Je crée une fonction simple avec TypeScript
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
Dans ES8, utilisez moment, maintenant 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');
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);
}