time()
ist in Sekunden - gibt es eine in Millisekunden?
php
time
milliseconds
COMer
quelle
quelle
time()
.microtime(true)
Auf der anderen Seite wird die aktuelle Zeit in Sekunden seit der Unix-Epoche auf die nächste Mikrosekunde genau zurückgegeben (siehe PHP-Referenz). Es ist tatsächlich sehr einfach zu testen, ob Sie den obigen Code in einer Schleife ausführen und die Millisekunden anzeigen.microtime(true) / 1000
(Teilung statt Multiplikation)?Verwenden Sie
microtime
. Diese Funktion gibt eine durch ein Leerzeichen getrennte Zeichenfolge zurück. Der erste Teil ist der Bruchteil von Sekunden, der zweite Teil ist der integrale Teil. Geben Sie eintrue
, um eine Nummer zu erhalten:Achten Sie bei der Verwendung auf Präzisionsverluste
microtime(true)
.Es gibt auch,
gettimeofday
dass der Mikrosekunden-Teil als Ganzzahl zurückgegeben wird.quelle
microtime()
gleich1000*time()
, oder?1000
, oder?microtime(true)
und1000*time()
1000*time()
dir keine Millisekunden.microtime(true)
Gibt a mit einerfloat
Genauigkeit von 14 Stellen zurück. Der Sekunden-Teil dauerte bereits 10, so dass 4 Stellen für den Mikrosekunden-Teil übrig blieben. Dies sollte ausreichen, da für Millisekunden nur 3 zusätzliche Ziffern erforderlich sind.Kurze Antwort:
Nur 64-Bit-Plattformen!
[ Wenn Sie 64-Bit-PHP ausführen,
PHP_INT_SIZE
entspricht die Konstante8
]Lange Antwort:
Wenn Sie zuerst eine gleichwertige Funktion
time()
in Millisekunden wünschen, müssen Sie berücksichtigen, dasstime()
die Anzahl der Millisekunden seit der "Epochenzeit" eine große Zahl ist , da die Anzahl der seit der "Epochenzeit" (01.01.1970) verstrichenen Sekunden zurückgegeben wird und passt nicht in eine 32-Bit-Ganzzahl.Die Größe einer Ganzzahl in PHP kann je nach Plattform 32 oder 64 Bit betragen.
Von http://php.net/manual/en/language.types.integer.php
Wenn Sie 64-Bit-Ganzzahlen haben, können Sie die folgende Funktion verwenden:
microtime()
Gibt die Anzahl der Sekunden seit der "Epochenzeit" mit einer Genauigkeit von bis zu Mikrosekunden zurück, wobei zwei durch Leerzeichen getrennte Zahlen wie ...Die zweite Zahl ist die Sekunde (Ganzzahl), während die erste der Dezimalteil ist.
Die obige Funktion
milliseconds()
nimmt den ganzzahligen Teil multipliziert mit1000
addiert dann den Dezimalteil multipliziert mit
1000
und gerundet auf 0 DezimalstellenBeachten Sie, dass beide
$mt[1]
und das Ergebnis von in umgewandeltround
werdenint
. Dies ist notwendig, weil siefloat
s sind und die Operation an ihnen ohne Gießen dazu führen würde, dass die Funktion a zurückgibtfloat
.Schließlich ist diese Funktion etwas genauer als
dass bei einem Verhältnis von 1:10 (ungefähr) 1 Millisekunde mehr als das richtige Ergebnis zurückgegeben wird. 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 bevorzugen,round(microtime(true)*1000);
würde ich vorschlagen,int
das Ergebnis zu besetzen.Auch wenn dies den Rahmen der Frage sprengt, ist es erwähnenswert, dass Sie, wenn Ihre Plattform 64-Bit-Ganzzahlen unterstützt , die aktuelle Zeit in Mikrosekunden abrufen können, ohne dass es zu einem Überlauf kommt.
Wenn die Tatsache
2^63 - 1
(größte vorzeichenbehaftete Ganzzahl) geteilt durch10^6 * 3600 * 24 * 365
(ungefähr die Mikrosekunden in einem Jahr) ergibt292471
.Das ist der gleiche Wert, den Sie erhalten
Mit anderen Worten, eine vorzeichenbehaftete 64-Bit-Ganzzahl bietet Platz für eine Zeitspanne von über 200.000 Jahren, gemessen in Mikrosekunden.
Sie können dann haben
quelle
Wie bereits erwähnt, können Sie mit
microtime()
Zeitstempeln eine Millisekundengenauigkeit erzielen.Aus Ihren Kommentaren geht hervor, dass Sie es als hochpräzisen UNIX-Zeitstempel wünschen. So etwas wie
DateTime.Now.Ticks
in der .NET-Welt.Sie können dazu die folgende Funktion verwenden:
quelle
Verwendung
microtime(true)
in PHP 5 oder die folgende Änderung in PHP 4:Eine tragbare Möglichkeit, diesen Code zu schreiben, wäre:
quelle
echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];
Ausgabe:
2016-11-19 15:12:34.346351
quelle
$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']);
Versuche dies:
quelle
Dies funktioniert auch, wenn Sie mit 32-Bit-PHP arbeiten:
Beachten Sie, dass Sie hier keine ganzen Zahlen erhalten, sondern Zeichenfolgen. Dies funktioniert jedoch in vielen Fällen einwandfrei, beispielsweise beim Erstellen von URLs für REST-Anforderungen.
Wenn Sie Ganzzahlen benötigen, ist 64-Bit-PHP obligatorisch.
Dann können Sie den obigen Code wiederverwenden und in (int) umwandeln:
Oder Sie können die guten alten Einzeiler verwenden:
quelle
Hoffe das hilft dir.
quelle
quelle
PHP 5.2.2 <
PHP 7.0.0 <7.1
quelle
Benutze das:
Tschüss
quelle