Javascript 如何找到两个UNIX时间戳之间的HH:MM:SS差异?

Javascript 如何找到两个UNIX时间戳之间的HH:MM:SS差异?,javascript,Javascript,我想创造一些计时器的东西。所以我有一些时间戳来标记完成时间,当脚本开始时,我得到当前时间戳,然后我只是每秒增加1。我需要以某种方式计算这两者之间的差异,并以小时:分钟:秒的格式显示 这是我目前的解决方案,但显然不起作用。结束时间和当前时间是时间戳: diff = end_time - cur_time; hours_diff = Math.ceil(diff/3600) mins_diff = Math.ceil((diff-hours_diff)/60) secs_diff = diff -

我想创造一些计时器的东西。所以我有一些时间戳来标记完成时间,当脚本开始时,我得到当前时间戳,然后我只是每秒增加1。我需要以某种方式计算这两者之间的差异,并以小时:分钟:秒的格式显示

这是我目前的解决方案,但显然不起作用。结束时间和当前时间是时间戳:

diff = end_time - cur_time;
hours_diff = Math.ceil(diff/3600)
mins_diff = Math.ceil((diff-hours_diff)/60)
secs_diff = diff - hours_diff*3600 - mins_diff*60;

我想你需要的是数学,而不是比赛。任何少于3600秒的时间都不是一小时

您可以使用模数%从分钟余数中过滤出小时数,秒数也是如此

hours_diff = Math.floor(diff/3600);
mins_diff = Math.floor((diff % 3600)/60)
secs_diff = diff%60;

我想你需要的是数学,而不是比赛。任何少于3600秒的时间都不是一小时

您可以使用模数%从分钟余数中过滤出小时数,秒数也是如此

hours_diff = Math.floor(diff/3600);
mins_diff = Math.floor((diff % 3600)/60)
secs_diff = diff%60;

您需要从较小的单元开始,逐步提高:

diff = Math.floor(diff / 1000);
var secs_diff = diff % 60;
diff = Math.floor(diff / 60);
var mins_diff = diff % 60;
diff = Math.floor(diff / 60);
var hours_diff = diff % 24;
diff = Math.floor(diff / 24);
// and so on, with the next divisor being 7
// for days by week, for example.
在每一步中,都要进行除法和余数运算。剩余部分将获取当前单位。除以和余数的量是下一个较大时间单位中的单位数

最初除以1000,假设时间戳以毫秒为单位。如果它们在几秒钟之内,你就不需要了

通过将除数和标签存储在一个数组中,可以使事情变得更整洁:

function timeDiff( tstart, tend ) {
  var diff = Math.floor((tend - tstart) / 1000), units = [
    { d: 60, l: "seconds" },
    { d: 60, l: "minutes" },
    { d: 24, l: "hours" },
    { d: 7, l: "days" }
  ];

  var s = '';
  for (var i = 0; i < units.length; ++i) {
    s = (diff % units[i].d) + " " + units[i].l + " " + s;
    diff = Math.floor(diff / units[i].d);
  }
  return s;
}

您需要从较小的单元开始,逐步提高:

diff = Math.floor(diff / 1000);
var secs_diff = diff % 60;
diff = Math.floor(diff / 60);
var mins_diff = diff % 60;
diff = Math.floor(diff / 60);
var hours_diff = diff % 24;
diff = Math.floor(diff / 24);
// and so on, with the next divisor being 7
// for days by week, for example.
在每一步中,都要进行除法和余数运算。剩余部分将获取当前单位。除以和余数的量是下一个较大时间单位中的单位数

最初除以1000,假设时间戳以毫秒为单位。如果它们在几秒钟之内,你就不需要了

通过将除数和标签存储在一个数组中,可以使事情变得更整洁:

function timeDiff( tstart, tend ) {
  var diff = Math.floor((tend - tstart) / 1000), units = [
    { d: 60, l: "seconds" },
    { d: 60, l: "minutes" },
    { d: 24, l: "hours" },
    { d: 7, l: "days" }
  ];

  var s = '';
  for (var i = 0; i < units.length; ++i) {
    s = (diff % units[i].d) + " " + units[i].l + " " + s;
    diff = Math.floor(diff / units[i].d);
  }
  return s;
}
使用JavaScript日期对象将时间戳转换为日期和时间:

var timeDifference = end_time - cur_time;
var differenceDate = new Date(timeDifference * 1000);
var diffHours = differenceDate.getUTCHours();
var diffMinutes = differenceDate.getUTCMinutes();
var diffSeconds = differenceDate.getUTCSeconds();
然后以H:M:S格式获取可读时间:

var readableDifference = diffHours + ':' + diffMinutes + ':' + diffSeconds;
你必须乘以1000才能得到毫秒的差值,这是Date的构造函数所期望的。 Unix时间戳表示自1970/01/01以来以秒为单位传递的时间

快速的JSFIDLE演示:

使用JavaScript日期对象将时间戳转换为日期和时间:

var timeDifference = end_time - cur_time;
var differenceDate = new Date(timeDifference * 1000);
var diffHours = differenceDate.getUTCHours();
var diffMinutes = differenceDate.getUTCMinutes();
var diffSeconds = differenceDate.getUTCSeconds();
然后以H:M:S格式获取可读时间:

var readableDifference = diffHours + ':' + diffMinutes + ':' + diffSeconds;
你必须乘以1000才能得到毫秒的差值,这是Date的构造函数所期望的。 Unix时间戳表示自1970/01/01以来以秒为单位传递的时间


快速的JSFIDLE演示:

创建一个以毫秒为单位的日期对象:

 d = new Date (seconds * 1000);
现在UTC小时、分钟和秒符合您的要求

 console.log (d.getUTCHours () ,d.getUTCMinutes (), d.getUTCSeconds ()) 

创建具有毫秒数的日期对象:

 d = new Date (seconds * 1000);
现在UTC小时、分钟和秒符合您的要求

 console.log (d.getUTCHours () ,d.getUTCMinutes (), d.getUTCSeconds ()) 

我想你需要的是Math.floor而不是Math.cell.diff是秒,hours\u diff是小时。。第三行可能类似于mins_diff=Math.floordiff-hours_diff*3600/601以秒为单位查找差异2使用日期:我认为你需要Math.floor而不是Math.ceil.diff以秒为单位,hours_diff以小时为单位。。第三行可能类似于mins_diff=Math.floordiff-hours_diff*3600/601在秒内找出差异2使用日期:这不起作用。它将报告根据时差构造的基本随机日期上的时间。正如@lwiii指出的,我不同意,end_time和cur_t是unix时间戳,以秒为单位。通过使用两者的差异构造一个日期对象,您可以得到预期的结果。如果您使用UTC时间,它可能会起作用。为了实现这一点,它依赖于构建日期被解释为第一个可能日期午夜之后的某个时间。如果JavaScript时区计算进入其中,事情将无法进行。@Pointy是一个很好的意料之外的双关语。我已经修改了我的答案,以UTC强制获取时间,所以它将在通常进行时区转换的机器上工作。这将不起作用。它将报告根据时差构造的基本随机日期上的时间。正如@lwiii指出的,我不同意,end_time和cur_t是unix时间戳,以秒为单位。通过使用两者的差异构造一个日期对象,您可以得到预期的结果。如果您使用UTC时间,它可能会起作用。为了实现这一点,它依赖于构建日期被解释为第一个可能日期午夜之后的某个时间。如果JavaScript时区计算进入其中,事情将无法进行。@Pointy是一个很好的意料之外的双关语。我已经修改了我的答案,强制使用UTC来获取时间,所以它可以在通常进行时区转换的机器上工作。哇,这个功能非常简洁。谢谢!所有这些数学知识都是完全没有必要的。一个简单的约会
我会为你做所有的工作,还有更多。检查我的答案。@losnir是的,我看到了你的答案,并对它进行了投票:唯一的优点是它可以让你灵活地按照你想要的方式调整时间尺度。例如,对于Date对象,添加17周的刻度有点困难,因为Date对象没有该时间单位的API。如果它有任何用处,那就太好了,否则我个人会坚持使用Date对象。顺便说一句,您可以始终使用diff/10281600,如果您不需要分辨率,这很好。另外,你会如何使用这个函数来设置刻度?@losnir我认为你能得到的唯一有趣的时间单位是周数。我的代码和日期方法的月数都会有问题;我想你必须用一种完全不同的方式。月数本质上是一个有问题的时间度量。哇,这个函数非常简洁。谢谢!所有这些数学知识都是完全没有必要的。一个简单的约会就能帮你完成所有的工作,还有更多。检查我的答案。@losnir是的,我看到了你的答案,并对它进行了投票:唯一的优点是它可以让你灵活地按照你想要的方式调整时间尺度。例如,对于Date对象,添加17周的刻度有点困难,因为Date对象没有该时间单位的API。如果它有任何用处,那就太好了,否则我个人会坚持使用Date对象。顺便说一句,您可以始终使用diff/10281600,如果您不需要分辨率,这很好。另外,你会如何使用这个函数来设置刻度?@losnir我认为你能得到的唯一有趣的时间单位是周数。我的代码和日期方法的月数都会有问题;我想你必须用一种完全不同的方式。月数几乎本质上是一个值得怀疑的时间尺度。