Date.now()
Baseline
広く利用可能
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2015年7月以降、すべてのブラウザーで利用可能です。
Date.now() は静的メソッドで、 UTC (協定世界時) で 1970 年 1 月 1 日の夜半と定義されている元期からの経過時間を、ミリ秒単位で返します。
試してみましょう
// この例は実行に 2 秒掛かります
const start = Date.now();
console.log("starting timer...");
// 予想される結果: "starting timer..."
setTimeout(() => {
const ms = Date.now() - start;
console.log(`seconds elapsed = ${Math.floor(ms / 1000)}`);
// 予想される結果: "seconds elapsed = 2"
}, 2000);
構文
js
Date.now()
引数
なし。
返値
現在時刻のタイムスタンプをミリ秒単位で表す数値です。
解説
>時間の精度の低下
タイミング攻撃やフィンガープリンティングに対する保護機能を提供するために、Date.now() の精度がブラウザーの設定に応じて下げられることがあります。
タイムスタンプは常にミリ秒単位の整数であるため、その分解能はすべてのコンテキストにおいて 1 ミリ秒に制限されます。これにより、基本的なセキュリティおよびプライバシーの要件はすでに満たされています。
Firefox では、privacy.reduceTimerPrecision 設定はデフォルトで有効になっています。デフォルト設定では、タイムスタンプの分解能は 1 ms です。privacy.resistFingerprinting が有効になっている場合、丸め間隔は 16.667 ms または privacy.resistFingerprinting.reduceTimerPrecision.microseconds で設定された間隔のうち、いずれか大きい方となります。最終的な出力は整数に丸められます。
例えば、Firefox では次のような値が考えられます。
js
// デフォルト設定での時間の精度の低下 (1 ms)
Date.now();
// 取りうる値:
// 1519211809934
// 1519211810363
// 1519211811671
// …
// `privacy.resistFingerprinting` が有効な場合の時間の精度の低下
Date.now();
// 取りうる値:
// 1519129853489
// 1519129853506
// 1519129853522
// …
例
>経過時間の測定
Date.now() を使用して現在の時刻をミリ秒単位で取得し、前回の時刻を差し引くと、2 つの呼び出し間の経過時間を求めることができます。
js
const start = Date.now();
doSomeLongRunningProcess();
console.log(`経過時間: ${Date.now() - start} ms`);
より複雑なシナリオでは、パフォーマンス API を使用することをお勧めします。
仕様書
| 仕様書 |
|---|
| ECMAScript® 2027 Language Specification> # sec-date.now> |