0

Мне нужно рассчитать точное различие по времени с использованием момента JS.Рассчитать точную разницу во времени с использованием момента JS

Мой JS код:

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

Теперь

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

Теперь эти моменты времени, я получаю выход как: Time interval: 1 days 25 hours 1500 minutes Он преобразовывает все в те дни (1 день ~ 25 часов).

Однако, выход, который я хочу: 1 день 1 час 0 минут.

Может ли кто-нибудь помочь мне в этом? Я новичок в JS и не могу понять это. Спасибо.

+1

Есть много вопросов по этому поводу уже, [* выбрать дубликат *] (http://stackoverflow.com/search?q=%5Bjavascript%5D+date+difference+in + дни). Метод moment.js [* diff *] (http://momentjs.com/docs/#/displaying/difference/) решает разницу в одном модуле, а не несколько. – RobG

ответ

1

Чтобы проанализировать строки, вы должны всегда сообщать парсеру формат, который вы предоставляете. Moment.js может помочь с этим, но вы также можете использовать свои собственные небольшие функции.

Для получения разницы в днях, часах и т. Д. Вы можете просто вычесть одну дату из другой, чтобы получить миллисекунды, а затем преобразовать ее в желаемый формат.

Обратите внимание, что арифметика даты не проста, существует множество правил, которые изменяются в зависимости от пользовательских или административных правил. Кроме того, при переходе на летнее время границы, некоторые дни составляют 23 часа и около 25.

Ниже приведен простой подход, который не учитывает летнее время. Надеемся, что комментариев достаточно, поиграйте с форматом вывода, чтобы получить все, что вам нужно.

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

Смежные вопросы