回答:
短い答えは次のとおりです。
$milliseconds = round(microtime(true) * 1000);
microtime(true) / 1000
(マルチプリケーションではなくディビジョン)ではないのですか?
を使用し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)
}
*/
microtime()
等しい1000*time()
ですか?
1000
です。
microtime(true)
および1000*time()
1000*time()
ミリ秒は与えられません。14桁の精度を持つをmicrotime(true)
返しますfloat
。秒の部分にはすでに10がかかっているため、マイクロ秒の部分には4桁が残っています。ミリ秒には3桁追加するだけなので、これで十分です。
64ビットプラットフォームのみ!
function milliseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}
[ 64ビットPHPを実行している場合、定数PHP_INT_SIZE
はに等しい8
]
time()
最初にミリ秒単位の等価関数が必要な場合はtime()
、「エポック時間」(1970年1月1日)から経過した秒数を返すため、「エポック時間」からのミリ秒数は大きな数であることを考慮する必要があります。 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()
スペースで区切られた2つの数値を使用して、マイクロ秒までの精度で「エポックタイム」からの秒数を返します。
0.90441300 1409263371
2番目の数値は秒(整数)で、最初の数値は小数部分です。
上記の関数milliseconds()
は整数部分に1000
1409263371000
次に、小数部を乗算し1000
、0の小数に丸めます
1409263371904
$mt[1]
との結果の両方round
がにキャストされることに注意してくださいint
。これらはfloat
sであり、キャストせずに操作すると関数がを返すため、これが必要float
です。
最後に、その関数は、
round(microtime(true)*1000);
比率が1:10(約)の場合、正しい結果よりも1ミリ秒多く戻ります。これは、float型の精度が制限されているためです(microtime(true)
floatを返します)。とにかく、あなたがまだ短い方が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));
}
他の人が述べたように、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);
}
microtime(true)
PHP 5で使用するか、PHP 4で次の変更を加えます。
array_sum(explode(' ', microtime()));
そのコードを移植するポータブルな方法は次のとおりです。
function getMicrotime()
{
if (version_compare(PHP_VERSION, '5.0.0', '<'))
{
return array_sum(explode(' ', microtime()));
}
return microtime(true);
}
echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];
出力:
2016-11-19 15:12:34.346351
$t = gettimeofday(); echo date('Y-m-d H:i:s.',$t['sec']) . $t['usec'];
$timeofday=gettimeofday(); echo sprintf("%s.%06d", date('Y-m-d H:i:s', $timeofday['sec']), $timeofday['usec']);
これを試して:
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");
}
これは、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
$the_date_time = new DateTime($date_string);
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) +
($the_date_time->format('u') / 1000);
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
time()
。microtime(true)
一方、UNIXエポックから最も近いマイクロ秒まで正確な現在の時刻を秒単位で返します(PHPリファレンスを参照)。上記のコードをループで実行してミリ秒を表示する場合、実際にテストするのは非常に簡単です。