web-dev-qa-db-fra.com

Comment obtenir l'heure actuelle en millisecondes en PHP?

time() est en secondes - y en a-t-il en millisecondes?

291
COMer

Le réponse courte est:

$milliseconds = round(microtime(true) * 1000);
451
laurent

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)
}
*/
81
kennytm

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);
}
40
Andrew Moore

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 floats 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));
}
39
Paolo

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);
}
11
Alix Axel

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

sortie:

2016-11-19 15:12:34.346351

8
mojmir.novak

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.

5
amnippon
$the_date_time = new DateTime($date_string);
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) +
    ($the_date_time->format('u') / 1000);
5
user3767296

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
5
Gras Double