time()
秒単位です - ミリ秒単位はありますか?
15 に答える
簡単な答えは次のとおりです。
$milliseconds = round(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)
}
*/
簡潔な答え:
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 ビット)。常に 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
が にキャストされることに注意してくださいint
。float
これらはであり、キャストせずにそれらを操作すると、関数が を返すため、これが必要です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));
}
他の人が述べたように、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);
}
echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];
出力:
2016-11-19 15:12:34.346351
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);
}
これを試して:
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");
}
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
$the_date_time = new DateTime($date_string);
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) +
($the_date_time->format('u') / 1000);
実際のマイクロ秒を表示したい場合は、precision
設定php.ini
を 16 に変更する必要があります。
その後、microsecond(true)
の出力をくれました1631882476.298437
。
なので余り( )を1000で割る必要があると思ったのですが、実は余りは1秒分です。したがって、正しい結果を得るには、これに 1000 を掛ける必要があります。298437
0.298437
function get_milliseconds()
{
$timestamp = microtime(true);
return (int)(($timestamp - (int)$timestamp) * 1000);
}
これは私の実装で、32 ビットでも動作するはずです。
function mstime(){
$mstime = explode(' ',microtime());
return $mstime[1].''.(int)($mstime[0]*1000);
}
これを使って:
function get_millis(){
list($usec, $sec) = explode(' ', microtime());
return (int) ((int) $sec * 1000 + ((float) $usec * 1000));
}
さよなら