如何将 performance.now() 输出转换为 UTC 字符串?



在我们的代码中,我们之前计算的是这样的事件之间的差异:

var beginTime = new Date();
// Do stuff
var endTime = new Date();
var duration = endTime.getTime() - beginTime.getTime();
console.log("Job began at " + beginTime.toUTCString()
+ " and took " + duration + " milliseconds.");

这将产生一个人类可读的字符串:

作业于 2017 年 9 月 28 日星期四 11:17:33 GMT-0500(中部夏令时间)开始,耗时 7000 毫秒。

我们决定通过使用更可靠的performance.now()切换到高分辨率时间。但是,我们仍然希望能够包含人类可读的 UTC 时间字符串。

最初,我们尝试了这个:

var beginTime = performance.now();
// Do stuff
var endTime = performance.now();
var duration = endTime - beginTime;
console.log("Job began at " + new Date(beginTime).toUTCString() 
+ " and took " + duration + " seconds.");

我们发现持续时间是准确的,但new Date(performance.now())会导致不准确的 UTC 值(在撰写本文时,它提供了过去近 50 年的日期)。

作业于 1969 年 12 月 31 日星期三 20:10:46 GMT-0600(中部标准时间)开始,耗时 7000 毫秒。

有没有更好的方法将performance.now()的输出转换为准确的 UTC 字符串?它不必是与new Date().toUTCString()完全相同的格式,但它应该是人类可读的。

我会这样做:

// mark the start time
performance.mark("start");
// ... 
//  later...
// ...
// mark the end time
performance.mark("end");
// create a measure called 'm' based on the two marks above
performance.measure("m", "start", "end");
// get the start mark, calculate its real-world timestamp using the time origin
var started = performance.getEntriesByName("start")[0];
var startedDt = new Date(performance.timing.navigationStart + started.startTime);
// get the measure we created above
var duration = performance.getEntriesByName("m")[0];
console.log(`job began on ${startedDt} and took ${duration.duration/1000.0} seconds`);
performance.clearMarks();

首先,标记持续时间测量的开始和结束时间。 其次,创建持续时间度量。

稍后,您将获得开始和结束标记,通过将时间原点与开始标记的时间戳相结合来计算开始日期。 最后,清除标记。

获得起始标记并非绝对必要...您还可以从测量m计算实际的开始时间戳,该也具有startTime。 我使用了开始标记,但任何一个都是有效的。

换句话说,您也可以这样做:

// get the measure we created above
var duration = performance.getEntriesByName("m")[0];
var startedDt = new Date(performance.timing.navigationStart + duration.startTime);
console.log(`job began on ${startedDt} and took ${duration.duration/1000.0} seconds`);

可以这样完成:

const t0 = performance.now();
// measured job here
const t1     = performance.now(),
t0Date = new Date(performance.timing.navigationStart + t0).toUTCString();
console.log(`Job began at ${t0Date} and took ${t1 - t0} milliseconds.`);
/* Console formatting only */
.as-console-wrapper { top: 0; }

但请注意,在performance.now()MDN页面之后(强调我的):

(...performance.timing.navigationStart + performance.now()大约等于Date.now()

对我来说,它在实际时间开始的一秒钟内。

来自 MDN,

Date.now()不同,Performance.now()返回的值总是 以恒定速率增加,与系统时钟无关( 可能会手动调整或由 NTP 等软件倾斜)。否则performance.timing.navigationStart + performance.now()将是 大约等于Date.now()

顾名思义performance.now()是在两个任务之间以5微秒的精度测量性能,而不是保持UNIX timeStamp

performance.timing.navigationStart + performance.now()将是大约等于Date.now()

阅读更多关于这里的信息。
https://developer.mozilla.org/en-US/docs/Web/API/Performance/now

这是不可能的。performance.now的返回值将页面加载作为其源 (0) 值,并且不能转换为日期。根据规范,您应该能够将其与performance.timeOrigin相加以获得 unix 时间戳,但是似乎没有任何浏览器对此的支持。

如果您想知道测量何时开始于挂钟时间,我建议您也存储传统的new Date/Date.now()时间戳。

相关内容

  • 没有找到相关文章

最新更新