Как мне получить дату в формате 2020-01-16 07: 29: 43.657519000 Z в js? - PullRequest
0 голосов
/ 27 мая 2020

Я нашел в проекте формат 2020-01-16 07:29:43.657519000 Z, и мне интересно, что именно означают эти числа 657519000 и как мне получить этот точный формат с js? Если я попробую что-то вроде new Date().toISOString(), я получу 2020-05-27T20:25:03.369Z, что похоже, но не совсем то же самое.

Спасибо за помощь

1 Ответ

0 голосов
/ 28 мая 2020

Браузеры обычно предоставляют значения времени в миллисекундах. DOMHighResTimeStamp был предназначен для обеспечения точности до микросекунды, и хотя некоторые браузеры играли с ним, я не думаю, что в настоящее время какой-либо из них обеспечивает такой уровень точности. уровень, это одна миллионная миллисекунды. Я не думаю, что браузеры или другие реализации будут иметь такой уровень точности в течение некоторого времени, а результирующее значение времени выходит за пределы диапазона значений, которые числа ECMAScript могут безопасно представлять. Любые числа после третьего десятичного знака - это просто шум и будут в основном девять (9) и нули (0).

В любом случае, теоретически вы можете получить текущее значение миллисекунды от до ISOString, затем обновите его значениями из объекта performance , чтобы получить ту точность, которую он обеспечивает, например,

// 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 нулей к десятичной части секунд от до ISOString :

console.log(new Date().toISOString().replace('T', ' ').replace('Z', '000000 Z'));

и не претендует на точность более разумной. Это может измениться, когда системы начнут поддерживать более точные значения времени с высокой точностью, и BigInt будет доступен для сохранения десятичных миллисекунд (хотя проблема с точностью все равно будет).

...