416 Stimmen

Wie erhält man die aktuelle Zeit in Millisekunden in PHP?

time() ist in Sekunden - gibt es auch eine in Millisekunden?

653voto

laurent Punkte 83238

En kurze Antwort ist:

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

111voto

kennytm Punkte 488916

Utilice microtime . Diese Funktion gibt eine durch ein Leerzeichen getrennte Zeichenkette zurück. Der erste Teil ist der gebrochene Teil der Sekunden, der zweite Teil ist der ganze Teil. Übergabe in true als Zahl zu erhalten:

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

Hüten Sie sich vor Präzisionsverlusten, wenn Sie microtime(true) .

Außerdem gibt es gettimeofday die den Mikrosekundenanteil als Ganzzahl zurückgibt.

var_dump(gettimeofday());
/*
array(4) {
  ["sec"]=>
  int(1283846202)
  ["usec"]=>
  int(891199)
  ["minuteswest"]=>
  int(-60)
  ["dsttime"]=>
  int(1)
}
*/

64voto

Paolo Punkte 14288

Kurze Antwort:

Nur 64-Bit-Plattformen!

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

[ _Wenn Sie 64-Bit-PHP verwenden, muss die Konstante PHP_INT_SIZE ist gleich 8_ ]


Lange Antwort:

Wenn Sie eine äquivalente Funktion von time() in Millisekunden, müssen Sie das zunächst als time() gibt die Anzahl der seit der "Epochenzeit" (01/01/1970) verstrichenen Sekunden, die Anzahl der Millisekunden da die "Epochenzeit" eine große Zahl ist und nicht in eine 32-Bit-Ganzzahl passt.

Die Größe eines Integers in PHP kann je nach Plattform 32 oder 64 Bit betragen.

En http://php.net/manual/en/language.types.integer.php

Die Größe einer ganzen Zahl ist plattformabhängig, obwohl ein Maximalwert von etwa zwei Milliarden der übliche Wert ist (das sind 32 Bit mit Vorzeichen). Bei 64-Bit-Plattformen liegt der Höchstwert normalerweise bei etwa 9E18, außer bei Windows, das immer 32 Bit hat. PHP unterstützt keine vorzeichenlosen Ganzzahlen. Die Größe von Ganzzahlen kann mit der Konstante PHP_INT_SIZE bestimmt werden, der Maximalwert mit der Konstante PHP_INT_MAX seit PHP 4.4.0 und PHP 5.0.5.

Wenn Sie 64-Bit-Ganzzahlen haben, können Sie die folgende Funktion verwenden:

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

microtime() gibt die Anzahl der Sekunden seit der "Epochenzeit" mit einer Genauigkeit von bis zu Mikrosekunden mit zwei durch Leerzeichen getrennten Zahlen zurück, wie...

0.90441300 1409263371

Bei der zweiten Zahl handelt es sich um die Sekunden (Ganzzahl), bei der ersten um den Dezimalteil.

Die obige Funktion milliseconds() nimmt den ganzzahligen Teil multipliziert mit 1000

1409263371000

addiert dann den Dezimalteil multipliziert mit 1000 und auf 0 Dezimalstellen gerundet

1409263371904

Beachten Sie, dass beide $mt[1] und das Ergebnis von round werden geworfen an int . Dies ist notwendig, weil sie float s und die Operation mit ihnen ohne Casting würde dazu führen, dass die Funktion ein float .

Schließlich ist diese Funktion etwas präziser als

round(microtime(true)*1000);

die bei einem Verhältnis von 1:10 (ca.) 1 Millisekunde mehr als das richtige Ergebnis liefert. Dies ist auf die begrenzte Genauigkeit des Float-Typs zurückzuführen ( microtime(true) gibt einen Float zurück). Wie auch immer, wenn Sie immer noch die kürzere round(microtime(true)*1000); Ich würde vorschlagen, dass Sie sich an int das Ergebnis.


Auch wenn es den Rahmen der Frage sprengt, ist es erwähnenswert, dass, wenn Ihre Plattform 64-Bit-Integer unterstützt, Sie auch liefert die aktuelle Zeit in Mikrosekunden ohne einen Überlauf zu verursachen.

Wenn Tatsache 2^63 - 1 (größte vorzeichenbehaftete ganze Zahl) geteilt durch 10^6 * 3600 * 24 * 365 (ungefähr die Mikrosekunden in einem Jahr) ergibt 292471 .

Das ist der gleiche Wert, den Sie mit

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

Mit anderen Worten: Eine Ganzzahl mit Vorzeichen von 64 Bit kann eine Zeitspanne von über 200.000 Jahren, gemessen in Mikrosekunden, speichern.

Sie haben dann vielleicht

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

49voto

Andrew Moore Punkte 90339

Wie andere bereits erwähnt haben, können Sie die microtime() um Zeitstempel mit Millisekundengenauigkeit zu erhalten.

Aus Ihren Kommentaren geht hervor, dass Sie es als hochpräzisen UNIX-Zeitstempel wünschen. Etwas wie DateTime.Now.Ticks in der .NET-Welt.

Dazu können Sie die folgende Funktion verwenden:

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

32voto

Milan Majer Punkte 394

Kürzeste Version der String-Variante (32-Bit-kompatibel):

$milliseconds = date_create()->format('Uv');

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X