time()
es en segundos, ¿hay uno en milisegundos?
time()
es en segundos, ¿hay uno en milisegundos?
Respuestas:
La respuesta corta es:
$milliseconds = round(microtime(true) * 1000);
microtime(true) / 1000
(división en lugar de multiplicación)?
Uso microtime
. Esta función devuelve una cadena separada por un espacio. La primera parte es la parte fraccionaria de segundos, la segunda parte es la parte integral. Pase true
para obtener un número:
var_dump(microtime()); // string(21) "0.89115400 1283846202"
var_dump(microtime(true)); // float(1283846202.89)
Tenga cuidado con la pérdida de precisión si usa microtime(true)
.
También hay gettimeofday
que devuelve la parte de microsegundos como un entero.
var_dump(gettimeofday());
/*
array(4) {
["sec"]=>
int(1283846202)
["usec"]=>
int(891199)
["minuteswest"]=>
int(-60)
["dsttime"]=>
int(1)
}
*/
microtime()
es igual 1000*time()
, ¿verdad?
1000
, ¿verdad?
microtime(true)
y1000*time()
1000*time()
no te dará milisegundos. microtime(true)
devuelve un float
que tiene 14 dígitos de precisión. La parte de segundos ya tomó 10, por lo que dejó 4 dígitos para la parte de microsegundos. Esto debería ser suficiente ya que los milisegundos solo requieren 3 dígitos adicionales.
¡Solo plataformas de 64 bits!
function milliseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}
[ Si está ejecutando PHP de 64 bits, entonces la constante PHP_INT_SIZE
es igual a8
]
Si desea una función equivalente time()
en milisegundos primero, debe tener en cuenta que, como time()
devuelve el número de segundos transcurridos desde el "tiempo de época" (01/01/1970), el número de milisegundos desde el "tiempo de época" es un número grande y no cabe en un entero de 32 bits.
El tamaño de un número entero en PHP puede ser de 32 o 64 bits, dependiendo de la plataforma.
De http://php.net/manual/en/language.types.integer.php
El tamaño de un número entero depende de la plataforma, aunque un valor máximo de aproximadamente dos mil millones es el valor habitual (32 bits con signo). Las plataformas de 64 bits generalmente tienen un valor máximo de aproximadamente 9E18, a excepción de Windows, que siempre es de 32 bits. PHP no admite enteros sin signo. El tamaño entero se puede determinar usando la constante PHP_INT_SIZE, y el valor máximo usando la constante PHP_INT_MAX desde PHP 4.4.0 y PHP 5.0.5.
Si tiene enteros de 64 bits, puede usar la siguiente función:
function milliseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}
microtime()
devuelve el número de segundos desde el "tiempo de época" con precisión hasta microsegundos con dos números separados por espacio, como ...
0.90441300 1409263371
El segundo número son los segundos (entero) mientras que el primero es la parte decimal.
La función anterior milliseconds()
toma la parte entera multiplicada por1000
1409263371000
luego agrega la parte decimal multiplicada por 1000
y redondeada a 0 decimales
1409263371904
Tenga en cuenta que ambos $mt[1]
y el resultado de round
se lanzan a int
. Esto es necesario porque son float
sy la operación en ellos sin conversión resultaría en que la función devuelva a float
.
Finalmente, esa función es un poco más precisa que
round(microtime(true)*1000);
que con una relación de 1:10 (aprox.) devuelve 1 milisegundo más que el resultado correcto. Esto se debe a la precisión limitada del tipo flotante ( microtime(true)
devuelve un flotante). De todos modos, si aún prefieres el más corto, round(microtime(true)*1000);
te sugiero que arrojes int
el resultado.
Incluso si está fuera del alcance de la pregunta, vale la pena mencionar que si su plataforma admite enteros de 64 bits, también puede obtener la hora actual en microsegundos sin incurrir en un desbordamiento.
Si el hecho 2^63 - 1
(mayor entero con signo) dividido entre 10^6 * 3600 * 24 * 365
(aproximadamente los microsegundos en un año) da 292471
.
Ese es el mismo valor que obtienes con
echo (int)( PHP_INT_MAX / ( 1000000 * 3600 * 24 * 365 ) );
En otras palabras, un entero de 64 bits con signo tiene espacio para almacenar un intervalo de tiempo de más de 200,000 años medido en microsegundos.
Puede que tengas entonces
function microseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000000 + ((int)round($mt[0] * 1000000));
}
Como han dicho otros, puede usar microtime()
para obtener una precisión de milisegundos en las marcas de tiempo.
Según sus comentarios, parece quererlo como una marca de tiempo UNIX de alta precisión. Algo así como DateTime.Now.Ticks
en el mundo .NET.
Puede usar la siguiente función para hacerlo:
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);
}
Usar microtime(true)
en PHP 5, o la siguiente modificación en PHP 4:
array_sum(explode(' ', microtime()));
Una forma portátil de escribir ese código sería:
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'];
salida:
2016-11-19 15:12:34.346351
$t = gettimeofday(); echo date('Y-m-d H:i:s.',$t['sec']) . $t['usec'];
$timeofday=gettimeofday(); echo sprintf("%s.%06d", date('Y-m-d H:i:s', $timeofday['sec']), $timeofday['usec']);
prueba esto:
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");
}
Esto funciona incluso si está en PHP de 32 bits:
list($msec, $sec) = explode(' ', microtime());
$time_milli = $sec.substr($msec, 2, 3); // '1491536422147'
$time_micro = $sec.substr($msec, 2, 6); // '1491536422147300'
Tenga en cuenta que esto no le da enteros, sino cadenas. Sin embargo, esto funciona bien en muchos casos, por ejemplo, al crear URL para solicitudes REST.
Si necesita números enteros, PHP de 64 bits es obligatorio.
Luego puede reutilizar el código anterior y enviarlo a (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
O puedes usar las buenas frases antiguas:
$time_milli = (int) round(microtime(true) * 1000); // 1491536422147
$time_micro = (int) round(microtime(true) * 1000000); // 1491536422147300
$timeparts = explode(" ",microtime());
$currenttime = bcadd(($timeparts[0]*1000),bcmul($timeparts[1],1000));
echo $currenttime;
NOTA: Se requiere PHP5 para esta función debido a las mejoras con microtime () y también se requiere el módulo matemático bc (ya que estamos tratando con números grandes, puede verificar si tiene el módulo en phpinfo).
Espero que esto te ayude.
$the_date_time = new DateTime($date_string);
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) +
($the_date_time->format('u') / 1000);
PHP 5.2.2 <
$d = new DateTime();
echo $d->format("Y-m-d H:i:s.u"); // u : Microseconds
PHP 7.0.0 <7.1
$d = new DateTime();
echo $d->format("Y-m-d H:i:s.v"); // v : Milliseconds
time()
.microtime(true)
Por otro lado, devuelve el tiempo actual en segundos desde la época de Unix con precisión al microsegundo más cercano (consulte la referencia de PHP). En realidad, es muy fácil probar si ejecuta el código anterior en un bucle y muestra los milisegundos.