如何在js中获得格式为2020-01-16 07:29:43.657519000 Z的日期?

时间:2020-05-27 20:34:45

标签: javascript date format

我在项目中找到了格式2020-01-16 07:29:43.657519000 Z,我想知道这些数字657519000到底是什么意思,以及如何使用js获得这种确切格式? 如果我尝试使用类似new Date().toISOString()之类的方法,则会得到2020-05-27T20:25:03.369Z相似但不完全相同的结果。

感谢帮助

1 个答案:

答案 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可用于保留小数毫秒时,这种情况可能会改变(尽管仍然存在精度问题)。