web-dev-qa-db-ja.com

PHPで現在時刻をミリ秒単位で取得する方法

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

284
COMer

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

$milliseconds = round(microtime(true) * 1000);
438
laurent

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)
}
*/
80
kennytm

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

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

あなたはそうするために次の関数を使うことができます:

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);
}
40
Andrew Moore

短い答え:

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

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

長い答え:

最初にミリ秒でtime()の同値関数が必要な場合は、time()が "Epoch time"(01/01/1970)から経過した秒数を返すので、 ミリ秒 "Epochから"の数を考慮する必要があります。 time "は大きな数値で、32ビット整数には収まりません。

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

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

整数のサイズはプラットフォームに依存しますが、最大値である約20億が通常の値です(32ビット符号付き)。 64ビットプラットフォームでは、通常、最大値は9E18ですが、Windowsの場合は常に32ビットです。 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()は、 "Epoch time"からの秒数を、2つの数字をスペースで区切ったマイクロ秒までの精度で返します。

0.90441300 1409263371

2番目の数字は、小数点以下の秒数(整数)です。

関数millisecondsは整数部分に1000を掛けたものです。

1409263371000

小数部に1000を掛けて0の小数に丸めます

1409263371904

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

最後に、この関数はより正確です。

round(microtime(true)*1000);

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


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

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

これはecho PHP_INT_MAX / (1000000*3600*24*365);が返すのと同じ値です

言い換えれば、符号付き整数には、マイクロ秒で測定した20万年以上のタイムスパンを保存する余地があります。

あなたはそれから

function microseconds() {
    $mt = explode(' ', microtime());
    return ((int)$mt[1]) * 1000000 + ((int)round($mt[0] * 1000000));
}
38
Paolo

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);
}
11
Alix Axel

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

出力:

2016-11-19 15:12:34.346351

8
mojmir.novak

これを試して:

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"); 
}
$timeparts = explode(" ",microtime());
$currenttime = bcadd(($timeparts[0]*1000),bcmul($timeparts[1],1000));
echo $currenttime;

注:microtime()の改善のため、この関数にはPHP 5が必要です。また、bc mathモジュールも必要です(多数を扱っているので、phpinfoにモジュールがあるかどうかを確認できます)。

これがお役に立てば幸いです。

5
amnippon
$the_date_time = new DateTime($date_string);
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) +
    ($the_date_time->format('u') / 1000);
5
user3767296

32ビットPHPを使用している場合でもこれは機能します。

list($msec, $sec) = explode(' ', microtime());

$time_milli = $sec.substr($msec, 2, 3); // '1491536422147'
$time_micro = $sec.substr($msec, 2, 6); // '1491536422147300'

これはあなたに整数ではなく文字列を与えることに注意してください。ただし、これは多くの場合、たとえばREST要求のURLを作成するときには正常に機能します。


整数が必要な場合は、64ビットのPHPは必須です。

その後、上記のコードを再利用して(int)にキャストできます。

list($msec, $sec) = explode(' ', microtime());

// these parentheses are mandatory otherwise the precedence is wrong!
//                  ↓                        ↓
$time_milli = (int) ($sec.substr($msec, 2, 3)); // 1491536422147
$time_micro = (int) ($sec.substr($msec, 2, 6)); // 1491536422147300

あるいは、古き良きワンライナーを使用することができます。

$time_milli = (int) round(microtime(true) * 1000);    // 1491536422147
$time_micro = (int) round(microtime(true) * 1000000); // 1491536422147300
5
Gras Double