PHPのミリ秒の取得について

採用はこちら

PHPで現在時刻のミリ秒を取得したい場合は、主に microtime() を使用します。

たとえば、JavaScriptの Date.now() のように「1970年1月1日からの経過時間をミリ秒で取得したい」場合は、次のように書きます。

$milliseconds = (int) floor(microtime(true) * 1000);

echo $milliseconds;

出力例は次のようになります。

1714801234567

これは、Unixエポックと呼ばれる 1970年1月1日 00:00:00 UTC からの経過時間を、ミリ秒単位で表した値です。

PHPでミリ秒を扱う場合は、「現在時刻をミリ秒で取得したいのか」「処理時間をミリ秒で計測したいのか」によって、使う関数が変わります。

現在時刻のミリ秒を取得するなら microtime()、処理時間を計測するなら hrtime() を使うのが基本です。

目次

PHPで現在時刻のミリ秒を取得する基本コード

現在時刻をミリ秒単位のUnixタイムスタンプとして取得するには、次のように書きます。

$milliseconds = (int) floor(microtime(true) * 1000);

または、よりシンプルに次のように書くこともできます。

$milliseconds = (int) (microtime(true) * 1000);

microtime(true) は、現在のUnixタイムスタンプを小数付きの秒数で返します。

たとえば、次のような値です。

1714801234.5678

これは秒単位の値なので、ミリ秒に変換するには 1000 を掛けます。

$milliseconds = microtime(true) * 1000;

すると、次のような値になります。

1714801234567.8

このままだと小数が残るため、整数として扱いたい場合は floor()(int) を使って小数部分を切り捨てます。

$milliseconds = (int) floor(microtime(true) * 1000);

実務では、この書き方を使えば十分なケースが多いです。

microtime(true) とは

microtime() は、現在のUnixタイムスタンプをマイクロ秒単位の精度で取得できるPHPの関数です。

通常の microtime() は文字列を返しますが、引数に true を指定すると、float型の数値として取得できます。

echo microtime(true);

出力例:

1714801234.5678

この値は、秒単位のUnixタイムスタンプです。

小数部分にミリ秒やマイクロ秒の情報が含まれています。

そのため、ミリ秒に変換したい場合は 1000 を掛けます。

$milliseconds = microtime(true) * 1000;

time() ではミリ秒を取得できない

PHPには time() という関数もあります。

echo time();

出力例:

1714801234

time() は、現在のUnixタイムスタンプを秒単位で返します。

そのため、ミリ秒の情報は含まれていません。

たとえば、次のように書いたとしても、正確な現在時刻のミリ秒にはなりません。

echo time() * 1000;

出力例:

1714801234000

これは、秒単位の値を単純に1000倍しているだけです。

本来の現在時刻が、

1714801234.567

だった場合、ミリ秒単位では次のような値が必要です。

1714801234567

しかし、time() では小数部分を取得できないため、ミリ秒部分が欠落します。

現在時刻をミリ秒まで取得したい場合は、time() ではなく microtime(true) を使いましょう。

round()floor()(int) の違い

microtime(true) * 1000 で取得した値は、小数を含むことがあります。

そのため、整数のミリ秒として扱うには、round()floor()(int) などを使います。

それぞれの違いは次の通りです。

書き方処理内容特徴
round()四捨五入近い整数に丸める
floor()切り捨て現在時刻を超えない値にしやすい
(int)小数点以下を切り捨てシンプルに整数化できる

たとえば、次の値があるとします。

$time = 1714801234567.8;

それぞれの結果は次のようになります。

echo round($time); // 1714801234568
echo floor($time); // 1714801234567
echo (int) $time;  // 1714801234567

round() は四捨五入するため、場合によっては実際の時刻より1ミリ秒進んだ値になることがあります。

通常のログやAPI用途では大きな問題にならないことが多いですが、現在時刻を超えない値として扱いたい場合は、floor() または (int) を使う方が自然です。

おすすめは次の書き方です。

$milliseconds = (int) floor(microtime(true) * 1000);

または、シンプルに書くなら次の形でも問題ありません。

$milliseconds = (int) (microtime(true) * 1000);

JavaScriptの Date.now() と同じ形式で取得する

JavaScriptでは、現在時刻のミリ秒タイムスタンプを次のように取得します。

Date.now();

PHPでこれに近い値を取得したい場合は、次のようにします。

$milliseconds = (int) floor(microtime(true) * 1000);

これにより、JavaScriptの Date.now() と同じように、Unixエポックからの経過時間をミリ秒単位で取得できます。

たとえば、フロントエンドとバックエンドで時刻を比較したい場合や、APIでミリ秒単位のタイムスタンプを送信したい場合に便利です。

ただし、PHP側で実行した時刻とJavaScript側で実行した時刻は完全には一致しません。

あくまで「同じ形式の値を取得できる」という意味で、Date.now() 相当と考えるとよいでしょう。

DateTimeImmutable を使ってミリ秒を取得する方法

PHPでは、DateTimeImmutable を使ってミリ秒単位のタイムスタンプを取得することもできます。

$milliseconds = (int) (new DateTimeImmutable())->format('Uv');

echo $milliseconds;

format('U') はUnixタイムスタンプの秒数を表します。

format('v') はミリ秒を表します。

そのため、format('Uv') と書くことで、秒単位のUnixタイムスタンプとミリ秒部分をつなげた値を取得できます。

$date = new DateTimeImmutable();

echo $date->format('Uv');

出力例:

1714801234567

microtime(true) を使う方法と同じように、現在時刻のミリ秒タイムスタンプとして利用できます。

ミリ秒付きの日時を表示する方法

Unixタイムスタンプではなく、次のように日時形式でミリ秒まで表示したい場合もあります。

2026-05-04 13:45:12.123

その場合は、DateTimeImmutablemicrotime(true) を組み合わせるとよいでしょう。

$microtime = microtime(true);

$datetime = DateTimeImmutable::createFromFormat('U.u', sprintf('%.6F', $microtime));

echo $datetime->format('Y-m-d H:i:s.v');

出力例:

2026-05-04 13:45:12.123

ここで使っている v はミリ秒を表します。

echo $datetime->format('v');

一方で、u はマイクロ秒を表します。

echo $datetime->format('Y-m-d H:i:s.u');

出力例:

2026-05-04 13:45:12.123456

ミリ秒まで表示したい場合は v、マイクロ秒まで表示したい場合は u を使いましょう。

date() だけではミリ秒を正確に扱いにくい

PHPの date() 関数でも日時を整形できます。

echo date('Y-m-d H:i:s');

ただし、date() は基本的に秒単位のUnixタイムスタンプを扱います。

そのため、現在時刻のミリ秒やマイクロ秒を正確に表示したい場合には向いていません。

たとえば、次のように書いても、期待通りのミリ秒やマイクロ秒が取得できないことがあります。

echo date('Y-m-d H:i:s.u');

ミリ秒付きの日時を正確に扱いたい場合は、date() だけで済ませるのではなく、DateTimeImmutablemicrotime(true) を組み合わせる方法がおすすめです。

$microtime = microtime(true);

$datetime = DateTimeImmutable::createFromFormat('U.u', sprintf('%.6F', $microtime));

echo $datetime->format('Y-m-d H:i:s.v');

ミリ秒とマイクロ秒の違い

PHPの microtime() は、名前の通りマイクロ秒単位の情報を扱える関数です。

ただし、実務ではミリ秒単位に変換して使うことが多いです。

ミリ秒とマイクロ秒の違いは次の通りです。

単位秒に対する大きさ
1秒
ミリ秒1/1,000秒
マイクロ秒1/1,000,000秒
ナノ秒1/1,000,000,000秒

つまり、次の関係になります。

1秒 = 1000ミリ秒
1秒 = 1,000,000マイクロ秒
1秒 = 1,000,000,000ナノ秒

microtime(true) は秒単位の小数を返すため、ミリ秒にしたい場合は 1000 を掛けます。

$milliseconds = microtime(true) * 1000;

マイクロ秒にしたい場合は、1,000,000 を掛けます。

$microseconds = microtime(true) * 1000000;

処理時間をミリ秒で計測する方法

ここまで紹介したのは、主に「現在時刻のミリ秒」を取得する方法です。

一方で、「この処理に何ミリ秒かかったか」を測りたい場合は、hrtime() を使うのがおすすめです。

$start = hrtime(true);

// 計測したい処理
usleep(250000); // 0.25秒待つ

$elapsedMs = (hrtime(true) - $start) / 1000000;

echo $elapsedMs . ' ms';

hrtime(true) はナノ秒単位の値を返します。

ミリ秒に変換するには、1,000,000 で割ります。

$milliseconds = $nanoseconds / 1000000;

処理時間の計測では、開始時点と終了時点の差を取ることが重要です。

$start = hrtime(true);

// 処理

$end = hrtime(true);

$elapsedMs = ($end - $start) / 1000000;

このように書くことで、処理にかかった時間をミリ秒単位で取得できます。

microtime()hrtime() の使い分け

microtime()hrtime() は、どちらも細かい時間を扱う関数ですが、用途が異なります。

目的使用する関数
現在時刻のミリ秒を取得したいmicrotime(true)
Unixタイムスタンプをミリ秒で取得したいmicrotime(true)
JavaScriptの Date.now() のような値がほしいmicrotime(true)
ミリ秒付きの日時を表示したいDateTimeImmutable + microtime(true)
処理時間をミリ秒で計測したいhrtime(true)
ベンチマークを取りたいhrtime(true)

特に注意したいのは、hrtime() は現在時刻を取得するための関数ではないという点です。

$now = hrtime(true) / 1000000;

このように書いても、Unixエポックからの現在時刻をミリ秒で取得できるわけではありません。

hrtime() は、任意の基準点からの高精度な時間を返す関数です。

そのため、現在時刻として使うのではなく、処理時間の差分を測る目的で使います。

$start = hrtime(true);

// 処理

$elapsedMs = (hrtime(true) - $start) / 1000000;

現在時刻を取得したい場合は microtime(true)、処理時間を測りたい場合は hrtime(true) と覚えるとわかりやすいです。

関数化して使う方法

ミリ秒の取得を何度も使う場合は、関数化しておくと便利です。

現在時刻のミリ秒タイムスタンプを返す関数

function currentMilliseconds(): int
{
    return (int) floor(microtime(true) * 1000);
}

echo currentMilliseconds();

この関数は、現在時刻をUnixミリ秒タイムスタンプとして返します。

DateTimeImmutable を使った関数

function currentMilliseconds(): int
{
    return (int) (new DateTimeImmutable())->format('Uv');
}

echo currentMilliseconds();

DateTimeImmutable を使いたい場合は、このように書くこともできます。

ミリ秒付きの日時を返す関数

function currentDateTimeWithMilliseconds(): string
{
    $microtime = microtime(true);

    $datetime = DateTimeImmutable::createFromFormat('U.u', sprintf('%.6F', $microtime));

    return $datetime->format('Y-m-d H:i:s.v');
}

echo currentDateTimeWithMilliseconds();

出力例:

2026-05-04 13:45:12.123

処理時間をミリ秒で計測する関数

function measureMilliseconds(callable $callback): float
{
    $start = hrtime(true);

    $callback();

    return (hrtime(true) - $start) / 1000000;
}

$elapsedMs = measureMilliseconds(function () {
    usleep(250000);
});

echo $elapsedMs . ' ms';

このようにしておくと、任意の処理にかかった時間をミリ秒単位で取得できます。

PHPでミリ秒を取得するときの注意点

microtime(true) はfloatを返す

microtime(true) はfloat型の値を返します。

そのため、非常に厳密な数値処理では、浮動小数点の丸め誤差に注意が必要です。

通常のWebアプリケーション、ログ出力、API送信用のタイムスタンプ、キャッシュバスターなどであれば、大きな問題になることは少ないです。

ただし、次のような用途では、より慎重な設計が必要です。

  • 厳密な時刻順序が必要なID生成
  • 金融系などの高精度な処理
  • 分散システムでの順序制御
  • マイクロ秒単位の厳密な比較
  • 高精度なベンチマーク

処理時間の計測であれば、microtime() よりも hrtime() を使う方が適しています。

round() を使うと実際の時刻より進む場合がある

次のように round() を使う方法もあります。

$milliseconds = (int) round(microtime(true) * 1000);

この書き方でも、多くの場面では問題ありません。

ただし、round() は四捨五入するため、値によっては実際の時刻より1ミリ秒進んだ値になる可能性があります。

現在時刻を超えない値として扱いたい場合は、次のように floor() を使う方が無難です。

$milliseconds = (int) floor(microtime(true) * 1000);

hrtime() はUnixタイムスタンプではない

hrtime(true) は高精度な時間を返しますが、Unixタイムスタンプではありません。

そのため、次のような使い方は避けましょう。

$milliseconds = hrtime(true) / 1000000;

これは現在時刻のミリ秒ではありません。

hrtime() は、次のように処理時間の計測に使います。

$start = hrtime(true);

// 処理

$elapsedMs = (hrtime(true) - $start) / 1000000;

よく使うコードまとめ

現在時刻のミリ秒Unixタイムスタンプ

$milliseconds = (int) floor(microtime(true) * 1000);

JavaScriptの Date.now() 相当

function date_now(): int
{
    return (int) floor(microtime(true) * 1000);
}

DateTimeImmutable でミリ秒を取得

$milliseconds = (int) (new DateTimeImmutable())->format('Uv');

ミリ秒付きの日時を表示

$microtime = microtime(true);

$datetime = DateTimeImmutable::createFromFormat('U.u', sprintf('%.6F', $microtime));

echo $datetime->format('Y-m-d H:i:s.v');

処理時間をミリ秒で計測

$start = hrtime(true);

// 処理

$elapsedMs = (hrtime(true) - $start) / 1000000;

echo $elapsedMs . ' ms';

まとめ

PHPで現在時刻のミリ秒を取得したい場合は、microtime(true) を使うのが基本です。

$milliseconds = (int) floor(microtime(true) * 1000);

JavaScriptの Date.now() のようなミリ秒タイムスタンプが必要な場合も、この書き方で対応できます。

日時としてミリ秒まで表示したい場合は、DateTimeImmutablemicrotime(true) を組み合わせると便利です。

$microtime = microtime(true);

$datetime = DateTimeImmutable::createFromFormat('U.u', sprintf('%.6F', $microtime));

echo $datetime->format('Y-m-d H:i:s.v');

一方で、処理時間をミリ秒で計測したい場合は、microtime() よりも hrtime() を使うのがおすすめです。

$start = hrtime(true);

// 処理

$elapsedMs = (hrtime(true) - $start) / 1000000;

使い分けとしては、次のように覚えておくとよいでしょう。

現在時刻のミリ秒を取得する → microtime(true)
ミリ秒付きの日時を表示する → DateTimeImmutable + microtime(true)
処理時間をミリ秒で計測する → hrtime(true)

PHPでミリ秒を扱う際は、単に「ミリ秒を取得したい」と考えるのではなく、現在時刻を取得したいのか、処理時間を測りたいのかを分けて考えることが大切です。

以上、PHPのミリ秒の取得についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次