Ich versuche, ein formatiertes Datum zu erhalten, einschließlich der Mikrosekunden von Millisekunden.
Das einzige Problem ist, dass ich immer 000000 bekomme
date("m-d-Y H:i:s.u", $milliseconds/1000);
Ex. 28.07.2013 11: 26: 14.000000
Ich versuche, ein formatiertes Datum zu erhalten, einschließlich der Mikrosekunden von Millisekunden.
Das einzige Problem ist, dass ich immer 000000 bekomme
date("m-d-Y H:i:s.u", $milliseconds/1000);
Ex. 28.07.2013 11: 26: 14.000000
Antworten:
php.net sagt:
Mikrosekunden (hinzugefügt in PHP 5.2.2). Beachten Sie, dass dies
date()immer generiert wird,000000da ein ganzzahliger Parameter verwendet wird, währendDateTime::format()Mikrosekunden unterstützt werden, wenn dieseDateTimemit Mikrosekunden erstellt wurden.
Verwenden Sie also so einfach:
$micro_date = microtime();
$date_array = explode(" ",$micro_date);
$date = date("Y-m-d H:i:s",$date_array[1]);
echo "Date: $date:" . $date_array[0]."<br>";
Empfohlen und dateTime()Klasse von referenziert verwenden:
$t = microtime(true);
$micro = sprintf("%06d",($t - floor($t)) * 1000000);
$d = new DateTime( date('Y-m-d H:i:s.'.$micro, $t) );
print $d->format("Y-m-d H:i:s.u"); // note at point on "u"
Hinweis uist Mikrosekunden (1 Sekunde = 1000000 µs).
Ein weiteres Beispiel von php.net :
$d2=new DateTime("2012-07-08 11:14:15.889342");
Referenz von dateTime()auf php.net
Ich 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
microtime(false).)
Sie können dies problemlos mit dem Eingabeformat tun U.u.
$now = DateTime::createFromFormat('U.u', microtime(true));
echo $now->format("m-d-Y H:i:s.u");
Dies erzeugt die folgende Ausgabe:
04-13-2015 05:56:22.082300
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 ...
$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
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:
$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
echo $now->format("m-d-Y H:i:s.u") . '<br>';
$local = $now->setTimeZone(new DateTimeZone('Australia/Canberra'));
echo $local->format("m-d-Y H:i:s.u") . '<br>';
Erzeugt die folgende Ausgabe:
10-29-2015 00:40:09.433818
10-29-2015 11:40:09.433818
Beachten Sie, dass das Zeitformat sein muss, wenn Sie in MySQL eingeben möchten:
format("Y-m-d H:i:s.u")
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.
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).
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.
$t = explode(" ",microtime());
echo date("m-d-y H:i:s",$t[1]).substr((string)$t[0],1,4);
Für einen microtime () -Wert von 0.98236000 1407400573wird zurückgegeben 08-07-14 01:08:13.982.
echo date('m-d-Y H:i:s').substr(fmod(microtime(true), 1), 1);
Beispielausgabe:
02-06-2019 16:45:03.53811192512512
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.)
echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));
Beispielausgabe:
02-11-2019 15:33:03.624493
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
echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
substr()rundet nicht. Und in Kombination round()damit würde die nachfolgenden Nullen schneiden: stackoverflow.com/questions/7493305/… Das ist der Grund, warum ich vorgeschlagen habe sprintf().
Wenn Sie ein Datum wie JavaScript (new Date()).toISOString()aus irgendeinem Grund formatieren möchten, können Sie dies in PHP folgendermaßen tun:
$now = microtime(true);
gmdate('Y-m-d\TH:i:s', $now).sprintf('.%03dZ',round(($now-floor($now))*1000));
Beispielausgabe:
2016-04-27T18:25:56.696Z
Nur um zu beweisen, dass das Subtrahieren der ganzen Zahl die Genauigkeit des Dezimalteils nicht verringert:
>>> number_format(123.01234567890123456789,25)
=> "123.0123456789012408307826263"
>>> number_format(123.01234567890123456789-123,25)
=> "0.0123456789012408307826263"
PHP hat die Dezimalstellen gerundet, aber in beiden Fällen auf die gleiche Weise gerundet.
date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));?
$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.
$timeist MS, aber was ist damit 2286, 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.
function DateTime_us_utc(){
return DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
}
function DateTime_us(){
$now = DateTime_us_utc();
return $now->setTimeZone(new DateTimeZone(date_default_timezone_get()));
}
Also für mich dann
$now = DateTime_us();
$now->format("m-d-Y H:i:s.u");
Ab PHP 7.1 können Sie dies einfach tun:
$date = new DateTime( "NOW" );
echo $date->format( "m-d-Y H:i:s.u" );
Es wird angezeigt als:
04-11-2018 10:54:01.321688
In der Dokumentation heißt es:
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.
Verwenden Sie stattdessen DateTime.
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:
$dateString = substr($millseconds_go_here,0,10);
$drawDate = new \DateTime(Date('Y-m-d H:i',$dateString));
$drawDate->setTimezone(new \DateTimeZone('UTC'));
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 festgelegt date_default_timezone_set("Timezone");ist, bevor Sie DateTime()Funktionen und Klassen verwenden.DateTime()Klassen oder Funktionen verwendet werden.Wenn Sie Carbon verwenden, können Sie die definierte Spezifikation "RFC3339_EXTENDED" verwenden. oder passen Sie es an.
Carbon::RFC3339_EXTENDED = 'Y-m-d\TH:i:s.vP';
Basierend auf der Antwort von @ArchCodeMonkey.
Wenn Sie haben declare(strict_types=1), müssen Sie das zweite Argument in einen String umwandeln
Ich habe verschiedene Wege eingeschlagen:
1) microtime + sscanf + date:
sscanf(microtime(), '0.%6s00 %s', $usec, $sec);
$date = date('Y-m-d H:i:s.', $sec) . $usec;
Ich bin nicht sicher, warum microtime () 10 Zeichen (0.dddddd00) für den Mikrosekunden-Teil zurückgibt, aber vielleicht kann es mir jemand sagen?
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { sscanf(microtime(), '0.%6s00 %s', $usec, $sec); $date = date('Y-m-d H:i:s.', $sec) . $usec; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "22372.335910797 ms" // macOS PHP 5.6.30
string(18) "16772.964000702 ms" // Linux PHP 5.4.16
string(18) "10382.229089737 ms" // Linux PHP 7.3.11 (same linux box as above)
2) DateTime :: createFromFormat + Datetime-> Format:
$now = new DateTime('NOW');
$date = $now->format('Y-m-d H:i:s.u');
funktioniert nicht in PHP 5.x ...
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $now = new DateTime('NOW'); $date = $now->format('Y-m-d H:i:s.u'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "45801.825046539 ms" // macOS PHP 5.6.30 (ms not working)
string(18) "21180.155038834 ms" // Linux PHP 5.4.16 (ms not working)
string(18) "11879.796028137 ms" // Linux PHP 7.3.11 (same linux box as above)
3) gettimeofday + date:
$time = gettimeofday();
$date = date('Y-m-d H:i:s.', $time['sec']) . $time['usec'];
- -
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $time = gettimeofday(); $date = date('Y-m-d H:i:s.', $time['sec']) . $time['usec']; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "23706.788063049 ms" // macOS PHP 5.6.30
string(18) "14984.534025192 ms" // Linux PHP 5.4.16
string(18) "7799.1390228271 ms" // Linux PHP 7.3.11 (same linux box as above)
4) microtime + number_format + DateTime :: createFromFormat + DateTime-> format:
$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
$date = $now->format('Y-m-d H:i:s.u');
- -
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', '')); $date = $now->format('Y-m-d H:i:s.u'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "83326.496124268 ms" // macOS PHP 5.6.30
string(18) "61982.603788376 ms" // Linux PHP 5.4.16
string(16) "19107.1870327 ms" // Linux PHP 7.3.11 (same linux box as above)
5) microtime + sprintf + DateTime :: createFromFormat + DateTime-> format:
$now = DateTime::createFromFormat('U.u', sprintf('%.6f', microtime(true)));
$date = $now->format('Y-m-d H:i:s.u');
- -
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $now = DateTime::createFromFormat('U.u', sprintf('%.6f', microtime(true))); $date = $now->format('Y-m-d H:i:s.u'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "79387.331962585 ms" // macOS PHP 5.6.30
string(18) "60734.437942505 ms" // Linux PHP 5.4.16
string(18) "18594.941139221 ms" // Linux PHP 7.3.11 (same linux box as above)