您的位置:

实现高精度时间获取的Javascript函数

一、javascript中获取时间的常用方法

在javascript中,我们通常使用新建Date对象的方式获取当前的时间,并可以通过该对象调用相关的方法得到年、月、日、时、分、秒等信息:

var date = new Date();
var year = date.getFullYear(); //获取年份
var month = date.getMonth()+1; //获取月份,需要注意的是月份是从0开始的,因此需要加1
var day = date.getDate(); //获取日期
var hour = date.getHours(); //获取小时
var minute = date.getMinutes(); //获取分钟
var second = date.getSeconds(); //获取秒

但是基于系统内核计算机在时间表示上的精度(一般不超过万分之一秒), Date对象可能无法满足所有高要求精度的场景。这时候需要用到高精度时间获取的方法。接下来我们介绍两种方法,一种是通过window.performance.now()函数实现,另一种是通过window.Date.now()函数实现。

二、window.performance.now()函数实现高精度时间获取

window.performance.now() 方法返回当前网页自 1970/01/01 00:00:00 UTC(协调世界时)到当前时间的毫秒数。这个函数返回的是一个浮点数类型,这个浮点数类型没有整数部分,只有小数部分。

var start = window.performance.now(); //获取当前时间
// 这里是需要进行测量时间的代码逻辑
var end = window.performance.now(); //获取结束时间
var costTime = end - start; //得出两次时间差,单位为毫秒
console.log("代码逻辑执行耗费时间:"+costTime+"ms"); //输出结果

三、window.Date.now()函数实现高精度时间获取

window.Date.now() 返回自1970年1月1日00:00:00 UTC到当前时间的毫秒数。

var startTime = window.Date.now(); //获取当前时间
// 这里是需要进行测量时间的代码逻辑
var endTime = window.Date.now(); //获取结束时间
var costTime = endTime - startTime; //得出两次时间差,单位为毫秒
console.log("代码逻辑执行耗费时间:"+costTime+"ms"); //输出结果

四、结合getBoundingClientRect()方法实现高精度时间获取

通过前两种方式获取的时间还不能算真正意义上的高精度时间(这里的精度是指能够达到微秒级别),接下来我们介绍一种高精度获取时间的方法。通过window.performance.now()也只能够获取到当前chrome进程的相对时间,而无法获取硬件级别的真实时间戳,我们可以通过getBoundingClientRect()方法结合window.performance.timing.navigationStart来计算出一个硬件级别时间戳来获得真正意义上的高精度时间:

function getMicrosecondTimestamp() {
  var time = window.performance.now().toFixed(6); //获取相对时间
  var rect = document.body.getBoundingClientRect(); //获取body所在位置信息的DOMRect
  var slDifference = rect.left + window.screenLeft; //计算左边框与屏幕的距离
  var stDifference = rect.top + window.screenTop; //计算上边框与屏幕的距离
  var navigationStart = window.performance.timing.navigationStart; //获取navigationStart时间
  var microsecondTimestamp = time + navigationStart - slDifference*10 - stDifference*10; //计算时间戳
  return microsecondTimestamp;
}
console.log(getMicrosecondTimestamp()); //输出时间戳