139 votes

Obtention du format de date m-d-Y H:i:s.u à partir de millisecondes

J'essaie d'obtenir une date formatée, y compris les microsecondes d'un horodatage UNIX spécifié en millisecondes.

Le seul problème est que je continue à obtenir 000000, par exemple.

$milliseconds = 1375010774123;
$d = date("m-d-Y H:i:s.u", $milliseconds/1000);
print $d;

07-28-2013 11:26:14.000000

174voto

ArchCodeMonkey Points 1976

Vous pouvez facilement le faire avec le format d'entrée U.u .

$now = DateTime::createFromFormat('U.u', microtime(true));
echo $now->format("m-d-Y H:i:s.u");

Cela produit le résultat suivant :

04-13-2015 05:56:22.082300

Depuis la page du manuel PHP sur les formats de date :

  • U = Secondes depuis l'époque d'Unix
  • u = Microsecondes

http://php.net/manual/en/function.date.php


Merci à giggsey d'avoir signalé une faille dans ma réponse initiale, en ajoutant number_format() à la ligne devrait fixer le cas de la seconde exacte. Dommage que cela ne soit plus aussi élégant...

$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));

http://php.net/manual/en/function.number-format.php


Une remarque sur les fuseaux horaires en réponse à DaVe.

Normalement, le createFromFormat() utilise le fuseau horaire local si celui-ci n'est pas spécifié.

http://php.net/manual/en/datetime.createfromformat.php

Toutefois, la technique décrite ici consiste à initialiser l'objet DateTime à l'aide de la fonction microtime() qui renvoie le nombre de secondes écoulées depuis l'époque Unix (01 Jan 1970 00:00:00 GMT).

http://php.net/manual/en/function.microtime.php

Cela signifie que l'objet DateTime est implicitement initialisé à UTC, ce qui convient parfaitement aux tâches internes du serveur qui souhaitent simplement suivre le temps écoulé.

Si vous devez afficher l'heure d'un fuseau horaire particulier, vous devez le régler en conséquence. Toutefois, cette opération doit être effectuée dans une étape distincte après l'initialisation ( pas en utilisant le troisième paramètre de createFromFormat() ) pour les raisons évoquées ci-dessus.

El setTimeZone() peut être utilisée pour répondre à cette exigence.

http://php.net/manual/en/datetime.settimezone.php

A titre d'exemple :

$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>';

Produit la sortie suivante :

10-29-2015 00:40:09.433818
10-29-2015 11:40:09.433818

Notez que si vous voulez entrer dans mysql, le format de l'heure doit être :

format("Y-m-d H:i:s.u")

137voto

Marin Sagovac Points 1689

php.net dit :

Microsecondes (ajouté en PHP 5.2.2). Notez que date() générera toujours 000000 puisqu'il prend un paramètre entier, alors que DateTime::format() supporte les microsecondes si DateTime a été créé avec des microsecondes.

Donc, utiliser aussi simple :

$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>";

Recommandé et utilisé dateTime() de la classe référencée :

$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"

Note u est une microseconde (1 seconde = 1000000 µs).

Un autre exemple de php.net :

$d2=new DateTime("2012-07-08 11:14:15.889342");

Référence de dateTime() en php.net

J'ai répondu à une question aussi courte et simple que celle de l'auteur. S'il vous plaît voir pour plus d'informations à l'auteur : obtention du format de date m-d-Y H:i:s.u à partir des millisecondes

16voto

thotso Points 305

Voici une approche un peu plus courte. Plutôt que de travailler à la création d'une date/heure numérique de haute précision, je convertis la valeur de la microseconde en une chaîne de caractères, j'enlève l'élément 0 et l'ajouter à la fin de la chaîne date/heure. Je peux facilement réduire le nombre de décimales en ajustant le paramètre de longueur de la chaîne ; ici j'utilise 4 pour obtenir des millisecondes, mais vous pourriez utiliser 7 pour obtenir des microsecondes.

$t = explode(" ",microtime());
echo date("m-d-y H:i:s",$t[1]).substr((string)$t[0],1,4);

Pour une valeur microtime() de 0.98236000 1407400573 ce qui donne 08-07-14 01:08:13.982 .

13voto

bamossza Points 587

J'utilise

echo date("Y-m-d H:i:s.").gettimeofday()["usec"];

output: 2017-09-05 17:04:57.555036

7voto

ghbarratt Points 4468
# PHP 8 type safe when using declare(strict_types=1);
echo date('m-d-Y H:i:s').substr((string) fmod(microtime(true), 1), 1, 4);

exemple de sortie :

02-06-2019 16:45:03.53811192512512

Si vous avez besoin de limiter le nombre de décimales, la ligne ci-dessous (crédit mgutt) serait une bonne alternative. (Avec le code ci-dessous, le 6 limite le nombre de décimales à 6).

echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));

exemple de sortie :

02-11-2019 15:33:03.624493

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X