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


回答:


506

短い答えは次のとおりです。

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

26
@FredrikWendt、私はあなたがと混同していると思いますtime()microtime(true)一方、UNIXエポックから最も近いマイクロ秒まで正確な現在の時刻を秒単位で返します(PHPリファレンスを参照)。上記のコードをループで実行してミリ秒を表示する場合、実際にテストするのは非常に簡単です。
laurent

6
絶対やった!:-)
Fredrik Wendt

10
私は短い答えが好きです。
エリックロバートソン

9
それはmicrotime(true) / 1000(マルチプリケーションではなくディビジョン)ではないのですか?
ジョーダンレフ

18
@ JordanLev、microtime(true)はUnixタイムスタンプを秒単位で浮動小数点として返すため、乗算でなければなりません。
laurent 14

88

を使用し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()ですか?
COM 09/10/7

エラーが発生する可能性がありますが、エラーはより小さいはず1000です。
COMer

@COMer:どのバリアントについて話しているのですか?
kennytm

microtime(true)および1000*time()
COMer

@COMer:1000*time()ミリ秒は与えられません。14桁の精度を持つをmicrotime(true)返しますfloat。秒の部分にはすでに10がかかっているため、マイクロ秒の部分には4桁が残っています。ミリ秒には3桁追加するだけなので、これで十分です。
kennytm

46

短い答え:

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。これらはfloatsであり、キャストせずに操作すると関数がを返すため、これが必要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));
}

なぜだけではない: `function getMilliEpoch(){$ mt = explode( ''、microtime()); $ mt [1]を返します。substr($ mt [0]、0、5)* 1000; } `
マイケル

今マイクロタイム関数のパラメーターがあります。trueに設定されている場合、1970年1月1日からの秒とミリ秒を0時間0分0秒を浮動小数点数として返します。次に例を示します。microtime(true)// 1553260455.7242
kukko

@kukkoはい、ただし、float型の精度制限があるため、microtime(true)からMillicesondsの数を計算すると、
Paolo

42

他の人が述べたように、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);
}

それがそれを行う方法です!
tonix 2014

1
perrrrrrfect ..♥。
SRBが2018

サーバー時間を返さないですか?私の場合、dbに保存されている時間はローカルブラウザの時間です。サーバーのタイムゾーンがEST + 3で、ブラウザーの時刻がGMT + 6であるとします。GMT+ 6の場所からフォームを送信すると、保存されている時刻はGMT + 6時間に相当するミリ秒です。それで、問題は何ですか?:(
ゼニス

12

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);
}

11

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

出力:

2016-11-19 15:12:34.346351


1
これは同じタイムスタンプを使用します:$t = gettimeofday(); echo date('Y-m-d H:i:s.',$t['sec']) . $t['usec'];
Savvas Radevic

:マイクロ秒はゼロでパディングする必要があります$timeofday=gettimeofday(); echo sprintf("%s.%06d", date('Y-m-d H:i:s', $timeofday['sec']), $timeofday['usec']);
Mabiの

7

これを試して:

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"); 
}

6

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

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

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


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);

それは実際に右に3つのゼロを埋め込むようなものですか?
Zeeshan

どういたしまして。両方の部分をミリ秒に変換して合計を出します。したがって、ゼロを追加するよりも正確です。
user3767296 2015

1
このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。また、コードと説明コメントを混同しないようにしてください。これにより、コードと説明の両方が読みにくくなります。
のMichałPerłakowski


-2

これを使って:

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

バイバイ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.