time()
est en secondes - y en a-t-il en millisecondes?
Le réponse courte est:
$milliseconds = round(microtime(true) * 1000);
Utilisez microtime
. Cette fonction retourne une chaîne séparée par un espace. La première partie est la partie fractionnaire des secondes, la deuxième partie est la partie intégrante. Passez true
pour obtenir un numéro:
var_dump(microtime()); // string(21) "0.89115400 1283846202"
var_dump(microtime(true)); // float(1283846202.89)
Méfiez-vous des pertes de précision si vous utilisez microtime(true)
.
Il existe également gettimeofday
qui renvoie la partie en microsecondes sous forme d’entier.
var_dump(gettimeofday());
/*
array(4) {
["sec"]=>
int(1283846202)
["usec"]=>
int(891199)
["minuteswest"]=>
int(-60)
["dsttime"]=>
int(1)
}
*/
Comme d'autres l'ont déjà indiqué, vous pouvez utiliser microtime()
pour obtenir une précision à la milliseconde sur les horodatages.
D'après vos commentaires, vous semblez le souhaiter comme horodatage UNIX de haute précision. Quelque chose comme DateTime.Now.Ticks
dans le monde .NET.
Vous pouvez utiliser la fonction suivante pour le faire:
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);
}
Réponse courte:
uniquement sur les plates-formes 64 bits!
function milliseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}
Réponse longue:
Si vous voulez une fonction équivalente de time()
en millisecondes, vous devez d'abord considérer que time()
renvoie le nombre de secondes écoulées depuis le "Epoch time" (01/01/1970), le nombre de millisecondes puisque "l'époque" est un grand nombre et ne rentre pas dans un entier de 32 bits.
La taille d'un entier dans PHP peut être de 32 ou 64 bits, selon la plate-forme.
De http://php.net/manual/en/language.types.integer.php
La taille d'un entier dépend de la plate-forme, bien qu'une valeur maximale d'environ deux milliards soit la valeur habituelle (c'est-à-dire 32 bits signés). Les plates-formes 64 bits ont généralement une valeur maximale d'environ 9E18, à l'exception de Windows, qui est toujours 32 bits. PHP ne supporte pas les entiers non signés. La taille entière peut être déterminée à l'aide de la constante PHP_INT_SIZE et la valeur maximale à l'aide de la constante PHP_INT_MAX depuis PHP 4.4.0 et PHP 5.0.5.
Si vous avez des entiers 64 bits, vous pouvez utiliser la fonction suivante:
function milliseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}
microtime()
renvoie le nombre de secondes écoulées depuis "l’époque" avec une précision pouvant aller jusqu’à quelques microsecondes avec deux nombres séparés par un espace, comme ...
0.90441300 1409263371
Le deuxième nombre est constitué par les secondes (nombre entier) précédées de la partie décimale.
La fonction milliseconds
prend la partie entière multipliée par 1000
1409263371000
et ajoute la partie décimale multipliée par 1000
et arrondie à 0 décimale
1409263371904
Notez que $mt[1]
et le résultat de round
sont convertis en int
. Cela est nécessaire car ils sont float
s et que l'opération effectuée sans transtypage aurait pour conséquence que la fonction retourne un float
.
Enfin, cette fonction est légèrement plus précise que
round(microtime(true)*1000);
avec un rapport de 1:10 (environ) renvoie 1 milliseconde de plus que le résultat correct. Cela est dû à la précision limitée du type float (microtime(true)
renvoie un float). Quoi qu'il en soit, si vous préférez toujours la round(microtime(true)*1000);
plus courte, je suggérerais de transtyper vers int
le résultat.
Même si cela dépasse le cadre de la question, il convient de mentionner que si votre plate-forme prend en charge les entiers 64 bits, vous pouvez également obtenir l'heure actuelle en microsecondes sans encourir en débordement.
Si le fait 2^63
(environ le plus grand entier signé) divisé par 10^6 * 3600 * 24 * 365
(environ les microsecondes en un an) donne environ 292471
.
C'est la même valeur renvoyée par echo PHP_INT_MAX / (1000000*3600*24*365);
En d'autres termes, un entier signé peut stocker une période de temps supérieure à 200 000 ans, mesurée en microsecondes.
Vous pouvez avoir alors
function microseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000000 + ((int)round($mt[0] * 1000000));
}
Utilisez microtime(true)
dans PHP 5 ou la modification suivante dans PHP 4:
array_sum(explode(' ', microtime()));
Un moyen portable d'écrire ce code serait:
function getMicrotime()
{
if (version_compare(PHP_VERSION, '5.0.0', '<'))
{
return array_sum(explode(' ', microtime()));
}
return microtime(true);
}
echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];
sortie:
2016-11-19 15:12:34.346351
essaye ça:
public function getTimeToMicroseconds() {
$t = microtime(true);
$micro = sprintf("%06d", ($t - floor($t)) * 1000000);
$d = new DateTime(date('Y-m-d H:i:s.' . $micro, $t));
return $d->format("Y-m-d H:i:s.u");
}
$timeparts = explode(" ",microtime());
$currenttime = bcadd(($timeparts[0]*1000),bcmul($timeparts[1],1000));
echo $currenttime;
REMARQUE: PHP5 est requis pour cette fonction en raison des améliorations apportées avec microtime () et le module mathématique bc est également requis (comme nous traitons de grands nombres, vous pouvez vérifier si vous avez le module dans phpinfo).
J'espère que cela vous aidera.
$the_date_time = new DateTime($date_string);
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) +
($the_date_time->format('u') / 1000);
Cela fonctionne même si vous utilisez PHP 32 bits:
list($msec, $sec) = explode(' ', microtime());
$time_milli = $sec.substr($msec, 2, 3); // '1491536422147'
$time_micro = $sec.substr($msec, 2, 6); // '1491536422147300'
Notez que cela ne vous donne pas des entiers, mais des chaînes. Cependant, cela fonctionne très bien dans de nombreux cas, par exemple lors de la création d'URL pour les demandes REST.
Si vous avez besoin d’entiers, PHP 64 bits est obligatoire.
Ensuite, vous pouvez réutiliser le code ci-dessus et convertir en (int):
list($msec, $sec) = explode(' ', microtime());
// these parentheses are mandatory otherwise the precedence is wrong!
// ↓ ↓
$time_milli = (int) ($sec.substr($msec, 2, 3)); // 1491536422147
$time_micro = (int) ($sec.substr($msec, 2, 6)); // 1491536422147300
Ou vous pouvez utiliser les bons vieux one-liners:
$time_milli = (int) round(microtime(true) * 1000); // 1491536422147
$time_micro = (int) round(microtime(true) * 1000000); // 1491536422147300