计算日期差异,获得小时、分钟和秒的差异 - 最好通过 js,否则 moment.js
calculate difference in dates, get difference in hours mins and seconds - ideally by js, otherwise moment.js
我通过以下方式成功计算了日期差异:
- 将收到的 unix 日期转换为 js 日期,
- 将当前日期保存为js日期,
- 将两者连同它们的格式一起传递给 moment.js 以获得差异
- 转换为毫秒
- 以毫秒为单位的差异转换为时刻 returns 小时 分钟 秒
我 运行 遇到了一个问题,特定版本的 moment 可以解决这个问题,而其他版本在计算差异时会在内部将异常作为 nan 抛出。很想用纯 js 来做,希望能避免这种情况。
上传了 fiddle,它不会 运行 除非你注释掉 moment 部分,因为在 cdn 上没有找到 moment.js 版本。
我更关注逻辑和一点 pseudocode/syntax 而不是工作示例。 JS 版本的问题是,当计算出的两个 unix 日期之间的差异随后转换为日期 *1000 毫秒时,它变成了 1970 年的日期。 js 中的 getMinutes() 也获取该时间戳的字面分钟数,而不是总分钟数,小时数等。
这是JS的瞬间示例:
var now = new Date(Date.now()),
ms = moment(then, "DD/MM/YYYY HH:mm:ss").diff(moment(now, "DD/MM/YYYY HH:mm:ss")),
d = moment.duration(ms),
formattedMomentDateDifference = Math.floor(d.asHours()) + ":";
formattedMomentDateDifference += Math.floor(d.minutes()) + ":";
formattedMomentDateDifference += Math.floor(d.seconds());
$('#momentdifference').val(formattedMomentDateDifference);
以下是 js 日期示例:
var then = cleanedReceivedDate, //cleaned received date in unix
difference = Math.floor(then - now)*1000, /* difference in milliseconds */
msDifferenceInDate = new Date(difference),
hoursDiff = msDifferenceInDate.getHours(),
minutesDiff = "0"+msDifferenceInDate.getHours(),
secondsDiff = "0"+msDifferenceInDate.getSeconds(),
formattedTime = hoursDiff + ':' + minutesDiff.substr(-2) + ':' + secondsDiff.substr(-2);
$('#jsdifference').val(formattedMomentDateDifference);
Matt 已链接到 moment.js 的副本,因此这只是一个 POJS 解决方案。
UNIX 时间值是自纪元以来的秒数,ECMAScript 时间值是自同一纪元以来的毫秒数。您需要做的就是将两者转换为相同的单位(秒或毫秒)并将差值转换为小时、分钟和秒。
例如 2016-10-02T00:00:00Z 的 UNIX 时间值是 1475366400,因此要获得主机系统时区中从那时到现在的小时、分钟和秒,请对差异做一些简单的数学运算从那时到现在:
var then = 1475366400, // Unix time value for 2016-10-02T00:00:00Z
now = Date.now(), // Current time value in milliseconds
diff = now - then*1000, // Difference in milliseconds
sign = diff < 0? '-' : '';
diff *= sign == '-'? -1 : 1;
var hrs = diff/3.6e6 | 0,
mins = diff%3.6e6 / 6e4 | 0,
secs = diff%6e4 / 1e3 ;
// Helper to pad single digit numbers
function z(n){return (n<10?'0':'') + n}
console.log(sign + hrs + ':' + z(mins) + ':' + z(secs));
PS
在new Date(Date.now())
中使用Date.now完全是多余的,结果与new Date()
相同。
我通过以下方式成功计算了日期差异:
- 将收到的 unix 日期转换为 js 日期,
- 将当前日期保存为js日期,
- 将两者连同它们的格式一起传递给 moment.js 以获得差异
- 转换为毫秒
- 以毫秒为单位的差异转换为时刻 returns 小时 分钟 秒
我 运行 遇到了一个问题,特定版本的 moment 可以解决这个问题,而其他版本在计算差异时会在内部将异常作为 nan 抛出。很想用纯 js 来做,希望能避免这种情况。
上传了 fiddle,它不会 运行 除非你注释掉 moment 部分,因为在 cdn 上没有找到 moment.js 版本。
我更关注逻辑和一点 pseudocode/syntax 而不是工作示例。 JS 版本的问题是,当计算出的两个 unix 日期之间的差异随后转换为日期 *1000 毫秒时,它变成了 1970 年的日期。 js 中的 getMinutes() 也获取该时间戳的字面分钟数,而不是总分钟数,小时数等。
这是JS的瞬间示例:
var now = new Date(Date.now()),
ms = moment(then, "DD/MM/YYYY HH:mm:ss").diff(moment(now, "DD/MM/YYYY HH:mm:ss")),
d = moment.duration(ms),
formattedMomentDateDifference = Math.floor(d.asHours()) + ":";
formattedMomentDateDifference += Math.floor(d.minutes()) + ":";
formattedMomentDateDifference += Math.floor(d.seconds());
$('#momentdifference').val(formattedMomentDateDifference);
以下是 js 日期示例:
var then = cleanedReceivedDate, //cleaned received date in unix
difference = Math.floor(then - now)*1000, /* difference in milliseconds */
msDifferenceInDate = new Date(difference),
hoursDiff = msDifferenceInDate.getHours(),
minutesDiff = "0"+msDifferenceInDate.getHours(),
secondsDiff = "0"+msDifferenceInDate.getSeconds(),
formattedTime = hoursDiff + ':' + minutesDiff.substr(-2) + ':' + secondsDiff.substr(-2);
$('#jsdifference').val(formattedMomentDateDifference);
Matt 已链接到 moment.js 的副本,因此这只是一个 POJS 解决方案。
UNIX 时间值是自纪元以来的秒数,ECMAScript 时间值是自同一纪元以来的毫秒数。您需要做的就是将两者转换为相同的单位(秒或毫秒)并将差值转换为小时、分钟和秒。
例如 2016-10-02T00:00:00Z 的 UNIX 时间值是 1475366400,因此要获得主机系统时区中从那时到现在的小时、分钟和秒,请对差异做一些简单的数学运算从那时到现在:
var then = 1475366400, // Unix time value for 2016-10-02T00:00:00Z
now = Date.now(), // Current time value in milliseconds
diff = now - then*1000, // Difference in milliseconds
sign = diff < 0? '-' : '';
diff *= sign == '-'? -1 : 1;
var hrs = diff/3.6e6 | 0,
mins = diff%3.6e6 / 6e4 | 0,
secs = diff%6e4 / 1e3 ;
// Helper to pad single digit numbers
function z(n){return (n<10?'0':'') + n}
console.log(sign + hrs + ':' + z(mins) + ':' + z(secs));
PS
在new Date(Date.now())
中使用Date.now完全是多余的,结果与new Date()
相同。