374

time()秒単位です - ミリ秒単位はありますか?

4

15 に答える 15

585

簡単な答えは次のとおりです。

$milliseconds = round(microtime(true) * 1000);
于 2012-07-11T02:20:03.883 に答える
103

を使用しmicrotimeます。この関数は、スペースで区切られた文字列を返します。最初の部分は秒の小数部分で、2 番目の部分は整数部分です。数値として取得するために渡すtrue:

var_dump(microtime());       // string(21) "0.89115400 1283846202"
var_dump(microtime(true));   // float(1283846202.89)

を使用する場合は、精度の低下に注意してくださいmicrotime(true)

gettimeofdayマイクロ秒の部分を整数として返すものもあります。

var_dump(gettimeofday());
/*
array(4) {
  ["sec"]=>
  int(1283846202)
  ["usec"]=>
  int(891199)
  ["minuteswest"]=>
  int(-60)
  ["dsttime"]=>
  int(1)
}
*/
于 2010-09-07T07:50:06.150 に答える
60

簡潔な答え:

64 ビット プラットフォームのみ!

function milliseconds() {
    $mt = explode(' ', microtime());
    return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}

[ 64 ビットの PHP を実行している場合、定数PHP_INT_SIZE8次のようになります]


長い答え:

time()最初にミリ秒単位の同等の関数が必要な場合はtime()、「エポック時間」(1970 年 1 月 1 日) から経過した秒数を返すので、「エポック時間」からのミリ秒数は大きな数字であると考える必要があります。 32 ビット整数には収まりません。

PHP の整数のサイズは、プラットフォームに応じて 32 ビットまたは 64 ビットになります。

http://php.net/manual/en/language.types.integer.phpから

整数のサイズはプラットフォームに依存しますが、最大値は約 20 億が通常の値です (符号付き 32 ビット)。常に 32 ビットである Windows を除いて、通常、64 ビット プラットフォームの最大値は約 9E18 です。PHP は符号なし整数をサポートしていません。PHP 4.4.0 および PHP 5.0.5 以降、整数サイズは定数 PHP_INT_SIZE を使用して決定でき、最大値は定数 PHP_INT_MAX を使用して決定できます。

64 ビットの整数がある場合は、次の関数を使用できます。

function milliseconds() {
    $mt = explode(' ', microtime());
    return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}

microtime()次のように、スペースで区切られた 2 つの数値を使用して、マイクロ秒までの精度で「エポック時間」からの秒数を返します...

0.90441300 1409263371

2 番目の数値は秒 (整数) で、最初の数値は小数部分です。

上記の関数milliseconds()は、整数部分に を掛けた値を取ります。1000

1409263371000

次に、小数部を乗算して1000小数点以下を 0 に丸めたものを追加します

1409263371904

$mt[1]と の結果の両方roundが にキャストされることに注意してくださいintfloatこれらはであり、キャストせずにそれらを操作すると、関数が を返すため、これが必要ですfloat

最後に、その関数はよりもわずかに正確です

round(microtime(true)*1000);

比率が 1:10 (約) の場合、正しい結果よりも 1 ミリ秒多く返されます。これは、float 型の精度が制限されているためです (float をmicrotime(true)返します)。とにかく、まだ短いほうが好きなら、結果round(microtime(true)*1000);にキャストすることをお勧めしintます。


質問の範囲を超えている場合でも、プラットフォームが 64 ビット整数をサポートしている場合、オーバーフローを引き起こすことなく現在の時刻をマイクロ秒単位で取得できることに言及する価値があります。

事実2^63 - 1(最大の符号付き整数) を10^6 * 3600 * 24 * 365(約 1 年間のマイクロ秒) で割ると292471.

それはあなたが得るのと同じ値です

echo (int)( PHP_INT_MAX / ( 1000000 * 3600 * 24 * 365 ) );

つまり、符号付き 64 ビット整数には、マイクロ秒単位で測定された 200,000 年を超えるタイムスパンを格納する余地があります。

あなたはそれを持っているかもしれません

function microseconds() {
    $mt = explode(' ', microtime());
    return ((int)$mt[1]) * 1000000 + ((int)round($mt[0] * 1000000));
}
于 2014-08-28T23:14:39.643 に答える
48

他の人が述べたように、microtime()タイムスタンプでミリ秒の精度を取得するために使用できます。

あなたのコメントから、あなたは高精度の UNIX タイムスタンプとしてそれを望んでいるようです。DateTime.Now.Ticks.NET の世界のようなものです。

これを行うには、次の関数を使用できます。

function millitime() {
  $microtime = microtime();
  $comps = explode(' ', $microtime);

  // Note: Using a string here to prevent loss of precision
  // in case of "overflow" (PHP converts it to a double)
  return sprintf('%d%03d', $comps[1], $comps[0] * 1000);
}
于 2010-09-07T08:20:25.150 に答える
14

echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];

出力:

2016-11-19 15:12:34.346351

于 2016-11-19T14:16:41.327 に答える
14

PHP 5 で使用するmicrotime(true)か、PHP 4 で次の変更を行います。

array_sum(explode(' ', microtime()));

そのコードを記述する移植可能な方法は次のようになります。

function getMicrotime()
{
    if (version_compare(PHP_VERSION, '5.0.0', '<'))
    {
        return array_sum(explode(' ', microtime()));
    }

    return microtime(true);
}
于 2010-09-07T10:23:36.577 に答える
8

これを試して:

public function getTimeToMicroseconds() {
    $t = microtime(true);
    $micro = sprintf("%06d", ($t - floor($t)) * 1000000);
    $d = new DateTime(date('Y-m-d H:i:s.' . $micro, $t));

    return $d->format("Y-m-d H:i:s.u"); 
}
于 2015-11-16T08:45:54.363 に答える
6

PHP 5.2.2 <

$d = new DateTime();
echo $d->format("Y-m-d H:i:s.u"); // u : Microseconds

PHP 7.0.0 < 7.1

$d = new DateTime();
echo $d->format("Y-m-d H:i:s.v"); // v : Milliseconds 
于 2019-10-09T10:26:54.127 に答える
5
$the_date_time = new DateTime($date_string);
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) +
    ($the_date_time->format('u') / 1000);
于 2015-07-30T09:56:15.083 に答える
1

実際のマイクロ秒を表示したい場合は、precision設定php.iniを 16 に変更する必要があります。

その後、microsecond(true)の出力をくれました1631882476.298437

なので余り( )を1000で割る必要があると思ったのですが、実は余りは1秒分です。したがって、正しい結果を得るには、これに 1000 を掛ける必要があります。2984370.298437

    function get_milliseconds()
    {
        $timestamp = microtime(true);
        return (int)(($timestamp - (int)$timestamp) * 1000);
    }
于 2021-09-17T12:50:54.557 に答える
-1

これは私の実装で、32 ビットでも動作するはずです。

function mstime(){
    $mstime = explode(' ',microtime());
    return $mstime[1].''.(int)($mstime[0]*1000);
}
于 2021-09-15T23:00:09.587 に答える
-2

これを使って:

function get_millis(){
  list($usec, $sec) = explode(' ', microtime());
  return (int) ((int) $sec * 1000 + ((float) $usec * 1000));
}

さよなら

于 2013-09-07T10:50:39.703 に答える