6

获得一个新DateTime的对我来说不够准确。浏览器中的日期对象以整数形式给我毫秒。我希望能够获得比标准日期对象更精确的时间。这可能吗?我怎样才能做到这一点?

4

2 回答 2

6

用于window.performance.now()获得单调、高分辨率的时间。该now()函数以小数形式返回带有微秒的双精度数。

这是一个例子:

import 'dart:html';

main() {
  var time = window.performance.now();
  print(time); // 12123.24341221
}

请注意,这now()不是典型的“从纪元开始的时间”。相反,它是window.performance.timing.navigationStart.

navigationStart字段定义为(来自规范):

此属性必须在用户代理完成提示卸载前一个文档后立即返回时间。如果没有以前的文档,则此属性必须返回与 fetchStart 相同的值。

时间戳很棒,window.performance.now()因为它不受时钟偏差的影响,并且比获取新的DateTime.

如果您的应用程序是由驱动的requestAnimationFrame(如果不是,为什么不呢?:) 那么您已经有了一个高分辨率的时间戳!

animationFrame以高分辨率时间戳完成的 Future 返回:

Future<num> animationFrame;

你可以像这样使用它:

gameLoop(num highResolutionTime) {
  // stuff
  window.animationFrame.then(gameLoop);
}

main() {
  window.animationFrame.then(gameLoop);
}
于 2013-04-01T05:22:38.147 回答
5

如果要测量时间跨度,请使用Stopwatch该类。它可以通用(在客户端和服务器上)并且应该提供最好的解决方案。

var sw = new Stopwatch()..start();
doSomething();
print(sw.elapsed);
print(sw.elapsedMicroseconds);

目前(截至 2013 年 4 月)浏览器中的秒表尚未使用该window.performance功能,但这是一个错误,应该修复。与此同时,您可以使用 Seth 建议的解决方法。

于 2013-04-01T12:37:55.880 回答