2016-05-10 22 views
0

Ich muss den genauen Zeitunterschied mit Moment JS berechnen.Berechnen Sie den genauen Zeitunterschied mit Moment JS

Mein JS-Code ist:

var a = moment(from_url); 
       a.format('DD/MM/YYYY hh:mm:ss'); 
       var b = moment(to_url); 
       b.format('DD/MM/YYYY hh:mm:ss'); 

       console.log("from URL") 
       var from_hours = from_url() 
       console.log(b.diff(a, 'minutes')) // 
       console.log(b.diff(a, 'hours')) // 
       console.log(b.diff(a, 'days')) // 
       console.log(b.diff(a, 'weeks')) // 

       console.log("Time interval: "+b.diff(a, 'days')+ " days "+ b.diff(a, 'hours') +" hours " +b.diff(a, 'minutes')+" mintes"); 

Jetzt

from_url = '2016-05-03T08:00:00'; 
to_url = '2016-05-04T09:00:00'; 

nun für diese Zeitpunkte, ich bin immer Ausgang als: Time interval: 1 days 25 hours 1500 minutes Es ist alles an den Tag (1 Tag Umwandlung ~ 25 Stunden).

Jedoch ist der Ausgang, den ich möchte, ist: 1 Tag 1 Stunde 0 Minuten.

Kann mir bitte jemand dabei helfen? Ich bin Neuling für JS und nicht in der Lage, dies herauszufinden. Danke.

+1

Es gibt viele Fragen zu diesem bereits, [* ein Duplikat * wählen] (http://stackoverflow.com/search?q=%5Bjavascript%5D+date+difference+in + Tage). Die Methode moment.js [* diff *] (http://momentjs.com/docs/#/displaying/difference/) behebt nur die Differenz in einer Einheit, nicht in mehreren. – RobG

Antwort

1

Um Strings zu analysieren, sollten Sie dem Parser immer das von Ihnen bereitgestellte Format mitteilen. Moment.js kann dabei helfen, aber Sie können auch Ihre eigenen kleinen Funktionen verwenden.

Um den Unterschied in Tagen, Stunden usw. zu erhalten, können Sie einfach ein Datum von einem anderen subtrahieren, um Millisekunden zu erhalten, und dieses dann in das gewünschte Format konvertieren.

Beachten Sie, dass Datumsarithmetik nicht einfach ist. Es gibt viele Regeln, die sich je nach benutzerdefinierten oder administrativen Regeln ändern. Auch wenn man über Grenzen hinweggeht, sind einige Tage 23 Stunden lang und etwa 25 Stunden.

Das Folgende ist ein einfacher Ansatz, der die Sommerzeit nicht berücksichtigt. Hoffentlich sind die Kommentare ausreichend, spielen Sie mit dem Ausgabeformat, um zu bekommen, was Sie brauchen.

// Parse ISO format string as local, ignore timezone 
 
// E.g. 2016-05-29T23:32:15 
 
function parseISOLocal(s) { 
 
    // Split string into its parts 
 
    var b = s.split(/\D/); 
 
    // Create and return a date object 
 
    return new Date(b[0], b[1]-1, b[2], b[3], b[4], b[5]); 
 
} 
 

 
// Convert a millisecond value to days, hours, minutes and seconds 
 
function formatDHMS(ms) { 
 
    // Helper to add 's' to a number if other than 1 
 
    function addS(n){return n == 1? '' : 's';} 
 
    
 
    // Get the whole values of each unit, rounded down (|0 truncates) 
 
    var d = ms/8.64e7 | 0;   // days 
 
    var h = (ms%8.64e7)/3.6e6 | 0; // hours 
 
    var m = (ms%3.6e6)/6e4 | 0; // minutes 
 
    var s = (ms%6e4) /1e3 | 0; // seconds 
 

 
    // Return a formatted string 
 
    return d + ' day' + addS(d) + ', ' + 
 
     h + ' hour' + addS(h) + ', ' + 
 
     m + ' minute' + addS(m) + ' and ' + 
 
     s + ' second' + addS(s); 
 
} 
 

 
document.write(formatDHMS(parseISOLocal('2016-05-04T09:00:00') - parseISOLocal('2016-05-03T08:00:00')))