我在项目中找到了格式2020-01-16 07:29:43.657519000 Z
,我想知道这些数字657519000
到底是什么意思,以及如何使用js获得这种确切格式?
如果我尝试使用类似new Date().toISOString()
之类的方法,则会得到2020-05-27T20:25:03.369Z
相似但不完全相同的结果。
感谢帮助
答案 0 :(得分:0)
浏览器通常提供以毫秒为单位的时间值。 DOMHighResTimeStamp的目的是提供微秒级的精度,尽管有些浏览器在嘲笑它,但我认为目前还没有这种级别的精度。
OP中的时间戳达到纳秒级,即毫秒的百万分之一。我认为浏览器或其他实现在一段时间内不会达到这种精度水平,并且所得到的时间值超出了ECMAScript数字可以安全表示的值范围。小数点后第三位之后的任何数字都只是杂音,大部分为9(9s)和0(0s)。
无论如何,从理论上讲,您可以从 toISOString 获取当前的毫秒值,然后使用 performance 对象的值对其进行更新,以获取其提供的精度,例如< / p>
// Current time in seconds precise to ±5 microseconds with
// nanosecond precision
function getSeconds() {
return ((performance.timing.navigationStart + performance.now()) / 1000).toFixed(9);
}
// Get timestamp to nanosecond precision
function getTimestamp() {
let s = getSeconds();
// Create a Date from the time value as milliseconds
let d = new Date(s * 1000);
// Tack on the decimal seconds from the time value
return d.toISOString().replace('T',' ').replace(/\d\d(\.\d+)?Z$/, (s%60).toFixed(9) + ' Z');
}
console.log(getTimestamp());
仅由于函数调用而导致的纳秒精度不是纳秒精度,这本身可能要花费几纳秒的时间(以及前面提到的ECMAScript无法表示所需的有效数字位数)。再加上系统时钟极不可能如此精确,因此您最好将6个零固定到 toISOString :
的秒小数部分:
console.log(new Date().toISOString().replace('T', ' ').replace('Z', '000000 Z'));
并不会假装比合理的准确。当系统开始支持更精确的高精度时间值并且BigInt可用于保留小数毫秒时,这种情况可能会改变(尽管仍然存在精度问题)。