使用moment JS计算准确的时间差

Calculate the exact time difference using moment JS

我需要使用 moment 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 的新手,无法弄清楚这一点。 谢谢

要解析字符串,您应该始终告诉解析器您提供的格式。 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')))