it-swarm.com.de

Holen Sie sich den Zeitunterschied zwischen zwei Datumsangaben

Ich weiß, dass ich mit momentjs alles und noch einiges mehr tun kann. Peinlich ist es mir jedoch schwer, etwas zu tun, das einfach erscheint: den Unterschied zwischen zwei Zeiten zu bekommen.

Beispiel:

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

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

was ich probiert habe:

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  

Ich verstehe nicht, was die "10" dort ist. Ich lebe in Brasilien, also sind wir utc-0300, wenn das relevant ist.

Das Ergebnis von moment.duration(now.diff(then)) ist eine Dauer mit den korrekten internen Werten: 

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

Ich denke, meine Frage ist: Wie konvertiere ich eine momentjs Duration in ein Zeitintervall? Ich kann sicher verwenden

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

aber ich fühle, dass es etwas mehr elegantes gibt, das mir völlig fehlt.

Update
Bei näherer Betrachtung ist now im obigen Beispiel: 

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

und moment(moment.duration(now.diff(then))) ist:

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

Ich bin nicht sicher, warum der zweite Wert in der Sommerzeit (-0200) ist ... aber ich bin mir sicher, dass ich keine Daten mag :(

Update 2  

nun, der Wert ist -0200, wahrscheinlich, weil der 31.12.1969 ein Datum war, an dem die Tageslichtzeit verwendet wurde.

206
Leo

Dieser Ansatz funktioniert NUR, wenn die Gesamtdauer weniger als 24 Stunden beträgt.

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"

Wenn Sie 24 Stunden oder mehr haben, werden die Stunden mit dem obigen Ansatz auf Null zurückgesetzt, sodass dies nicht ideal ist.

Wenn Sie eine gültige Antwort für eine Dauer von 24 Stunden oder länger erhalten möchten)

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"

Beachten Sie, dass ich die utc-Zeit als Abkürzung verwende. Sie könnten d.minutes() und d.seconds() getrennt herausziehen, aber Sie müssten sie auch zeropadieren.

Dies ist notwendig, da die Möglichkeit, einen duration-Einwand zu formatieren, momentan nicht in moment.js ist. Es wurde hier beantragt . Es gibt jedoch ein Drittanbieter-Plugin namens moment-duration-format , das speziell für diesen Zweck vorgesehen ist:

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"
305
Matt Johnson

Ihr Problem besteht darin, das Ergebnis von moment.duration () vor dem Formatieren wieder in moment () umzuwandeln. Dies führt dazu, dass moment () es als eine Zeit relativ zur Unix-Epoche interpretiert.

Es gibt Ihnen nicht genau das Format, das Sie suchen, aber

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

würde Ihnen ein nützliches Format wie "40 Minuten" geben. Wenn Sie wirklich an dieser speziellen Formatierung interessiert sind, müssen Sie selbst eine neue Zeichenfolge erstellen. Ein billiger Weg wäre

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

wo var diff = moment.duration(now.diff(then)). Dies gibt Ihnen nicht die Möglichkeit, einstellige Werte mit Nullen aufzufüllen. Dafür möchten Sie vielleicht etwas wie nderscore.string in Betracht ziehen, obwohl es ein langer Weg zu sein scheint, nur ein paar zusätzliche Nullen anzustreben. :)

62
TML
var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') //[days, years, months, seconds, ...]
//Result 1 

Für mich gearbeitet

Mehr dazu in http://momentjs.com/docs/#/displaying/difference/

53
Danilo Colasso

Wenn Sie einen Unterschied zwischen zwei Zeitstempeln in nur Tagen, Stunden und Minuten haben möchten, nicht in Monaten und Jahren.

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 enthält 2 Monate, 23 Tage, 23 Stunden und 20 Minuten. Aber wir brauchen nur Ergebnisse in Tagen, Stunden und Minuten, also ist die einfache Lösung:

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.

Das Endergebnis wird sein: 84 Tage, 23 Stunden, 20 Minuten.

27
Mahima Agrawal

Wenn Sie diff aufrufen, berechnet moment.js die Differenz in Millisekunden. Wenn die Millisekunden an duration übergeben werden, wird sie zur Berechnung der Dauer verwendet, die korrekt ist. Wenn Sie dieselben Millisekunden an moment() übergeben, berechnet es das Datum, das Millisekunden von (nach) Epoche/Unix-Zeit (1. Januar 1970, Mitternacht UTC/GMT) ist zusammen mit falscher Stunde.

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

Ich denke, das ist, wie Sie es tun sollten, da moment.js für die Dauer keine format-Funktion bietet. Sie können auch einen einfachen Wrapper schreiben, um es einfacher/schöner zu machen.

18
Joon

Wenn wir nur hh: mm: ss wollen, können wir eine solche Funktion verwenden:

//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;
}
9
Filipe Eusébio

Das sollte gut funktionieren. 

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());
6
Manzurul

Anstatt 

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

Es ist besser zu tun

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

Benutze das,

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

    var aa = duration.asHours();
1

DATUM ZEITBASIERTE EINGABE  

    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
    }

AUSGABE

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

Ich erstelle eine einfache Funktion mit 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)

zum Generieren von Javascript https://www.typescriptlang.org/play/index.html

0
Serkan KONAKCI

Verwenden Sie in ES8 Moment und beginnen Sie, Momentobjekte zu sein.

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');
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