Es ist seltsam, dass die Frage nach der Konvertierung von Millisekunden fragt , aber jeder antwortet, wie Mikrosekunden konvertiert werden. Ich weiß, dass Sie zwischen beiden konvertieren können, aber es wäre schön, die Frage tatsächlich zu beantworten, anstatt nicht verwandten Code aus dem PHP-Dokument oder anderswo zu kopieren und einzufügen.
Laurent
Ich weiß, es ist eine Weile her, aber Bamosszas Antwort war die beste, die ich hier gefunden habe
Mikrosekunden (hinzugefügt in PHP 5.2.2). Beachten Sie, dass dies date()immer generiert wird, 000000da ein ganzzahliger Parameter verwendet wird, während DateTime::format()Mikrosekunden unterstützt werden, wenn diese DateTimemit Mikrosekunden erstellt wurden.
Ich entscheide mich im Allgemeinen für die zweite Form, da sie leichter zu lesen und zu verstehen ist. Darüber hinaus ist DateTime weitaus flexibler und robuster als die Datums- / Uhrzeitfunktionen. Der Umgang mit Mikrosekunden ist ein typisches Beispiel.
Herbert
Ich stimme Herbert zu. @slik, das ist die beste Antwort :)
Marco Sulla
3
@Geo und AlBundy Könnten Sie dies auf einem Computer mit PHP <5.2.2 versuchen? PHP 5.4.39 läuft dies einwandfrei ...
RichardBernards
Wäre das nicht einfach? Datum ('mdY H: i: s'). (int) Mikrozeit (wahr);
Anant
@Anant, es wäre in der Tat ganz einfach. Aber falsch. ;) Was du dort bekommst, ist nur die Epoche in Sekunden. (Würde leider auch nicht funktionieren microtime(false).)
Sz.
138
Sie können dies problemlos mit dem Eingabeformat tun U.u.
Vielen Dank an Giggsey für den Hinweis auf einen Fehler in meiner ursprünglichen Antwort. Durch Hinzufügen number_format()zur Zeile sollte der Fall der genauen Sekunde behoben werden . Schade, dass es sich nicht mehr ganz so elegant anfühlt ...
Die hier beschriebene Technik initialisiert jedoch das DateTime-Objekt, mit microtime()dem die Anzahl der Sekunden zurückgegeben wird, die seit der Unix-Epoche (01. Januar 1970, 00:00:00 GMT) vergangen sind.
Dies bedeutet, dass das DateTime-Objekt implizit auf UTC initialisiert wird. Dies ist in Ordnung für serverinterne Aufgaben, die nur die verstrichene Zeit verfolgen möchten.
Wenn Sie die Zeit für eine bestimmte Zeitzone anzeigen müssen, müssen Sie sie entsprechend einstellen. Dies sollte jedoch aus den oben diskutierten Gründen als separater Schritt nach der Initialisierung erfolgen ( ohne Verwendung des dritten Parameters von createFromFormat()).
Das setTimeZone()Verfahren kann verwendet werden, um diese Anforderung zu erfüllen.
Hinweis: DateTime::createFromFormat('U.u', microtime(true));Gibt false zurück, wenn es microtime(true)genau in der Sekunde ausgeführt wird. Es wird '1438616239' anstelle von '1438616239.000000' zurückgegeben.
Giggsey
1
Tolle Lösung, danke. Es scheint, als würde ich meine Ortszeit verlieren und jetzt $ aus der Mikrozeit erstellen. Irgendeine Idee?
daVe
1
@daVe Ich habe einige Informationen zu Zeitzonen hinzugefügt. Ich hoffe, das war es, wonach Sie gesucht haben.
ArchCodeMonkey
1
Das number_formatist immer notwendig, auch wenn es nicht genau in der Sekunde ist. Andernfalls sind Sie der precisionPHP-Konfigurationsoption (für "Anzeige") ausgeliefert, die ab PHP 7.0 standardmäßig nicht hoch genug ist, was zu einem Genauigkeitsverlust führt (bis zur Mikrosekunde nicht genau).
Teoh Han Hui
1
Scrollen Sie
15
Hier ist ein etwas kürzerer Ansatz. Anstatt ein hochpräzises numerisches Datum / eine hochpräzise Uhrzeit zu erstellen, konvertiere ich den Mikrosekundenwert in eine Zeichenfolge, entferne die 0und füge sie am Ende der Datums- / Uhrzeitzeichenfolge hinzu. Ich kann die Anzahl der Dezimalstellen leicht reduzieren, indem ich den Parameter für die Zeichenfolgenlänge anpasse. hier verwende ich 4, um Millisekunden zu erhalten, aber Sie könnten verwenden 7, um Mikrosekunden zu erhalten.
Wenn Sie die Anzahl der Dezimalstellen begrenzen müssen, ist die folgende Zeile (credit mgutt) eine gute Alternative. (Mit dem folgenden Code begrenzt die 6 die Anzahl der Dezimalstellen auf 6.)
Sie haben die Präzision und die führende Null für Sekunden verfehlt. Also sollte die richtige Version sein echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));. Erklärung, warum wir brauchen 09: stackoverflow.com/a/28739819/318765
mgutt
Sie haben die Präzision wieder verpasst;)echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
@mgutt Wann wäre die erste Ziffer keine Null? Grundsätzlich ist es einfach erforderlich, die Null zu entfernen, die immer vorhanden ist, wenn der Rest von fmod um 1 abgerufen wird. Die Frage fragt nach Mikrosekunden, jedoch in Form von Dezimalstellen der Sekunden. Es gibt keinen Grund, die Anzahl der Dezimalstellen zu begrenzen. Mehr Dezimalstellen sind einfach eine bessere Genauigkeit.
Ghbarratt
@mgutt Ich habe Ihre erste vorgeschlagene Alternative zu meiner Antwort hinzugefügt und erklärt, dass dies eine gute Möglichkeit wäre, die Anzahl der Dezimalstellen bei Bedarf zu begrenzen
ghbarratt
3
Wenn Sie ein Datum wie JavaScript (new Date()).toISOString()aus irgendeinem Grund formatieren möchten, können Sie dies in PHP folgendermaßen tun:
Nein. Verwenden Sie keine Mathematik für die Gleitkommazahl, sie ist ungenau. Verschwenden Sie auch keine Zeit damit, mehrere Funktionen aufzurufen. Verwenden Sie einfach substr (), um das formatierte Datum auf drei Dezimalstellen zu kürzen.
LS
@LS Beim Abschneiden wird die 3. Dezimalstelle nicht gerundet, was wahrscheinlich noch ungenauer ist. Schwimmer brechen erst zusammen, wenn Sie wirklich winzige Präzisionen haben. 3 Dezimalstellen sollten in Ordnung sein. Eigentlich glaube ich nicht, dass ich die Genauigkeit überhaupt ändere. Floats werden genauer, je näher Sie 0 kommen. Wenn Sie die ganze Zahl abziehen, sollten Sie die AFAIK-Dezimalstellen nicht ändern.
Mpen
Was ist mit date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));?
F8ER
@ F8ER Wenn du $timeschon in Millisekunden bist , würde das technisch funktionieren. substrIch mag den Hack nicht, aber ich denke, er würde für Daten zwischen 2001 und 2286 funktionieren.
mpen
Ja, das $timeist MS, aber was ist damit 2286, ich meine, warum denkst du das und wie wäre es möglich, solchen zu entkommen?
F8ER
3
Dies basiert auf der Antwort von ArchCodeMonkey.
Aber nur vereinfacht, wenn Sie nur etwas schnelles wollen, das funktioniert.
Mikrosekunden (hinzugefügt in PHP 5.2.2). Beachten Sie, dass date () immer 000000 generiert, da ein ganzzahliger Parameter verwendet wird, während DateTime :: format () Mikrosekunden unterstützt.
Ja, gemäß der obigen Antwort (und meinen Versuchen) new DateTime()wird auch 0000 für u zurückgegeben. Wenn Sie ihm jedoch beim Instanziieren eine Mikrosekundengenauigkeit geben, funktioniert er einwandfrei.
Scipilot
@scipilot ok, wie machst du das?
Geo
@Geo siehe die akzeptierte Antwort. new DateTime( 'Y-m-d H:i:s.'.$micro);
Schneidet die letzten 4 Nullen von der Zeichenfolge ab, damit Date()das Datum verarbeitet werden kann.
Verwendet das Datum, um die Millisekunden in eine Datums- / Uhrzeitzeichenfolge zu formatieren, die DateTime verstehen kann.
DateTime()Sie können dann die Zeitzone ändern, in der Sie sich befinden. Stellen Sie jedoch sicher, dass diese festgelegt date_default_timezone_set("Timezone");ist, bevor Sie DateTime()Funktionen und Klassen verwenden.
Es wird empfohlen, in Ihren Klassen einen Konstruktor zu verwenden, um sicherzustellen, dass Sie sich in der richtigen Zeitzone befinden, wenn DateTime()Klassen oder Funktionen verwendet werden.
Antworten:
php.net sagt:
Verwenden Sie also so einfach:
Empfohlen und
dateTime()
Klasse von referenziert verwenden:Hinweis
u
ist Mikrosekunden (1 Sekunde = 1000000 µs).Ein weiteres Beispiel von php.net :
Referenz von
dateTime()
auf php.netIch habe die Frage als kurz beantwortet und dem Autor vereinfacht. Weitere Informationen zum Autor finden Sie unter: Abrufen des Datumsformats mdY H: i: su aus Millisekunden
quelle
microtime(false)
.)Sie können dies problemlos mit dem Eingabeformat tun
U.u
.Dies erzeugt die folgende Ausgabe:
Auf der PHP-Handbuchseite für Datumsformate:
http://php.net/manual/en/function.date.php
Vielen Dank an Giggsey für den Hinweis auf einen Fehler in meiner ursprünglichen Antwort. Durch Hinzufügen
number_format()
zur Zeile sollte der Fall der genauen Sekunde behoben werden . Schade, dass es sich nicht mehr ganz so elegant anfühlt ...http://php.net/manual/en/function.number-format.php
Ein Hinweis zu Zeitzonen als Antwort auf DaVe.
Normalerweise verwendet die
createFromFormat()
Methode die lokale Zeitzone, wenn keine angegeben ist.http://php.net/manual/en/datetime.createfromformat.php
Die hier beschriebene Technik initialisiert jedoch das DateTime-Objekt, mit
microtime()
dem die Anzahl der Sekunden zurückgegeben wird, die seit der Unix-Epoche (01. Januar 1970, 00:00:00 GMT) vergangen sind.http://php.net/manual/en/function.microtime.php
Dies bedeutet, dass das DateTime-Objekt implizit auf UTC initialisiert wird. Dies ist in Ordnung für serverinterne Aufgaben, die nur die verstrichene Zeit verfolgen möchten.
Wenn Sie die Zeit für eine bestimmte Zeitzone anzeigen müssen, müssen Sie sie entsprechend einstellen. Dies sollte jedoch aus den oben diskutierten Gründen als separater Schritt nach der Initialisierung erfolgen ( ohne Verwendung des dritten Parameters von
createFromFormat()
).Das
setTimeZone()
Verfahren kann verwendet werden, um diese Anforderung zu erfüllen.http://php.net/manual/en/datetime.settimezone.php
Als Beispiel:
Erzeugt die folgende Ausgabe:
Beachten Sie, dass das Zeitformat sein muss, wenn Sie in MySQL eingeben möchten:
quelle
DateTime::createFromFormat('U.u', microtime(true));
Gibt false zurück, wenn esmicrotime(true)
genau in der Sekunde ausgeführt wird. Es wird '1438616239' anstelle von '1438616239.000000' zurückgegeben.number_format
ist immer notwendig, auch wenn es nicht genau in der Sekunde ist. Andernfalls sind Sie derprecision
PHP-Konfigurationsoption (für "Anzeige") ausgeliefert, die ab PHP 7.0 standardmäßig nicht hoch genug ist, was zu einem Genauigkeitsverlust führt (bis zur Mikrosekunde nicht genau).Hier ist ein etwas kürzerer Ansatz. Anstatt ein hochpräzises numerisches Datum / eine hochpräzise Uhrzeit zu erstellen, konvertiere ich den Mikrosekundenwert in eine Zeichenfolge, entferne die
0
und füge sie am Ende der Datums- / Uhrzeitzeichenfolge hinzu. Ich kann die Anzahl der Dezimalstellen leicht reduzieren, indem ich den Parameter für die Zeichenfolgenlänge anpasse. hier verwende ich4
, um Millisekunden zu erhalten, aber Sie könnten verwenden7
, um Mikrosekunden zu erhalten.Für einen microtime () -Wert von
0.98236000 1407400573
wird zurückgegeben08-07-14 01:08:13.982
.quelle
Ich benutze
quelle
Beispielausgabe:
Wenn Sie die Anzahl der Dezimalstellen begrenzen müssen, ist die folgende Zeile (credit mgutt) eine gute Alternative. (Mit dem folgenden Code begrenzt die 6 die Anzahl der Dezimalstellen auf 6.)
Beispielausgabe:
quelle
echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));
. Erklärung, warum wir brauchen09
: stackoverflow.com/a/28739819/318765echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
substr()
rundet nicht. Und in Kombinationround()
damit würde die nachfolgenden Nullen schneiden: stackoverflow.com/questions/7493305/… Das ist der Grund, warum ich vorgeschlagen habesprintf()
.Wenn Sie ein Datum wie JavaScript
(new Date()).toISOString()
aus irgendeinem Grund formatieren möchten, können Sie dies in PHP folgendermaßen tun:Beispielausgabe:
Nur um zu beweisen, dass das Subtrahieren der ganzen Zahl die Genauigkeit des Dezimalteils nicht verringert:
PHP hat die Dezimalstellen gerundet, aber in beiden Fällen auf die gleiche Weise gerundet.
quelle
date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));
?$time
schon in Millisekunden bist , würde das technisch funktionieren.substr
Ich mag den Hack nicht, aber ich denke, er würde für Daten zwischen 2001 und 2286 funktionieren.$time
ist MS, aber was ist damit2286
, ich meine, warum denkst du das und wie wäre es möglich, solchen zu entkommen?Dies basiert auf der Antwort von ArchCodeMonkey.
Aber nur vereinfacht, wenn Sie nur etwas schnelles wollen, das funktioniert.
Also für mich dann
quelle
Hier ist eine andere Methode, die ich etwas eleganter / einfacher finde:
quelle
quelle
Ab PHP 7.1 können Sie dies einfach tun:
Es wird angezeigt als:
quelle
In der Dokumentation heißt es:
Verwenden Sie stattdessen DateTime.
quelle
new DateTime()
wird auch 0000 für u zurückgegeben. Wenn Sie ihm jedoch beim Instanziieren eine Mikrosekundengenauigkeit geben, funktioniert er einwandfrei.new DateTime( 'Y-m-d H:i:s.'.$micro);
Mit PHP 7.0+ können Sie jetzt Folgendes tun:
Dies führt die folgenden Schritte aus:
Date()
das Datum verarbeitet werden kann.DateTime()
Sie können dann die Zeitzone ändern, in der Sie sich befinden. Stellen Sie jedoch sicher, dass diese festgelegtdate_default_timezone_set("Timezone");
ist, bevor SieDateTime()
Funktionen und Klassen verwenden.DateTime()
Klassen oder Funktionen verwendet werden.quelle
Wenn Sie Carbon verwenden, können Sie die definierte Spezifikation "RFC3339_EXTENDED" verwenden. oder passen Sie es an.
quelle
Basierend auf der Antwort von @ArchCodeMonkey.
Wenn Sie haben
declare(strict_types=1)
, müssen Sie das zweite Argument in einen String umwandelnquelle
Ich habe verschiedene Wege eingeschlagen:
1) microtime + sscanf + date:
Ich bin nicht sicher, warum microtime () 10 Zeichen (0.dddddd00) für den Mikrosekunden-Teil zurückgibt, aber vielleicht kann es mir jemand sagen?
2) DateTime :: createFromFormat + Datetime-> Format:
funktioniert nicht in PHP 5.x ...
3) gettimeofday + date:
- -
4) microtime + number_format + DateTime :: createFromFormat + DateTime-> format:
- -
5) microtime + sprintf + DateTime :: createFromFormat + DateTime-> format:
- -
quelle