使用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')))
我需要使用 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')))