time()
ist in Sekunden - gibt es auch eine in Millisekunden?
Antworten
Zu viele Anzeigen?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)
}
*/
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));
}
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);
}
- See previous answers
- Weitere Antworten anzeigen