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

时间:2017-09-28 16:49:33

标签: javascript datetime high-resolution-time

在我们的代码中,我们之前计算过像这样的事件之间的区别:

alertify.prompt( 'Prompt Title', 'Prompt Message', 'Prompt Value',
    function(evt, value) {
        alertify.success('You entered: ' + value)
    }
    , function() {
        alertify.error('Cancel')
    }).setting({
        type    : 'number',
        min     : 8,
        max     : 30,
        value   : 8
    });

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

  

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

我们决定使用更可靠的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."); 切换到High Resolution Time。但是,我们仍然希望能够包含人类可读的UTC时间字符串。

最初,我们试过这个:

performance.now()

我们发现持续时间是准确的,但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."); 会导致UTC值不准确(在撰写本文时,它提供了过去近50年的日期)。

  

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

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

4 个答案:

答案 0 :(得分:2)

我会这样做:

// 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`);

答案 1 :(得分:2)

可以这样做:



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 page之后(强调我的):

  

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

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

答案 2 :(得分:1)

来自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

答案 3 :(得分:0)

这是不可能的。 performance.now的返回值确实有page load as their origin (0) value,无法转换为日期。根据规范,您应该能够将其与performance.timeOrigin相加以获得unix时间戳,但似乎没有任何浏览器支持。

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