Estoy tratando de obtener una fecha formateada, incluidos los microsegundos de milisegundos.
El único problema es que sigo recibiendo 000000
date("m-d-Y H:i:s.u", $milliseconds/1000);
ex. 28/07/2013 11: 26: 14.000000
Estoy tratando de obtener una fecha formateada, incluidos los microsegundos de milisegundos.
El único problema es que sigo recibiendo 000000
date("m-d-Y H:i:s.u", $milliseconds/1000);
ex. 28/07/2013 11: 26: 14.000000
Respuestas:
php.net dice:
Microsegundos (agregado en PHP 5.2.2). Tenga en cuenta que
date()siempre generará,000000ya que toma un parámetro entero, mientrasDateTime::format()que admite microsegundos siDateTimese creó con microsegundos.
Así que use tan 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>";
dateTime()Clase recomendada y de uso de la referencia:
$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"
La nota ues microsegundos (1 segundo = 1000000 µs).
Otro ejemplo de php.net :
$d2=new DateTime("2012-07-08 11:14:15.889342");
Referencia de dateTime()en php.net
Respondí una pregunta tan breve y simplificada al autor. Para obtener más información, consulte al autor: obteniendo el formato de fecha mdY H: i: su de milisegundos
microtime(false)ninguno).
2012-07-08 11:14:15.0.889342
Puede hacer esto fácilmente con el formato de entrada U.u.
$now = DateTime::createFromFormat('U.u', microtime(true));
echo $now->format("m-d-Y H:i:s.u");
Esto produce la siguiente salida:
04-13-2015 05:56:22.082300
Desde la página del manual de PHP para formatos de fecha:
http://php.net/manual/en/function.date.php
Gracias a giggsey por señalar un defecto en mi respuesta original, agregar number_format()a la línea debería corregir el caso del segundo exacto. Lástima que ya no se sienta tan elegante ...
$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
http://php.net/manual/en/function.number-format.php
Una nota sobre las zonas horarias en respuesta a DaVe.
Normalmente el createFromFormat() método utilizará la zona horaria local si no se especifica una.
http://php.net/manual/en/datetime.createfromformat.php
Sin embargo, la técnica descrita aquí es inicializar el objeto DateTime usando microtime() cual devuelve el número de segundos transcurridos desde la época de Unix (01 de enero de 1970 00:00:00 GMT).
http://php.net/manual/en/function.microtime.php
Esto significa que el objeto DateTime se inicializa implícitamente en UTC, lo que está bien para las tareas internas del servidor que solo desean realizar un seguimiento del tiempo transcurrido.
Si necesita mostrar la hora de una zona horaria en particular, debe configurarla en consecuencia. Sin embargo, esto debe hacerse como un paso separado después de la inicialización ( sin usar el tercer parámetro decreateFromFormat() ) debido a las razones discutidas anteriormente.
los setTimeZone() método se puede utilizar para cumplir con este requisito.
http://php.net/manual/en/datetime.settimezone.php
Como ejemplo:
$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>';
Produce la siguiente salida:
10-29-2015 00:40:09.433818
10-29-2015 11:40:09.433818
Tenga en cuenta que si desea ingresar en mysql, el formato de hora debe ser:
format("Y-m-d H:i:s.u")
DateTime::createFromFormat('U.u', microtime(true));devolverá falso si se microtime(true)ejecuta en el segundo exacto. Devuelve '1438616239' en lugar de '1438616239.000000'.
number_formatsiempre es necesario, incluso cuando no está en el segundo exacto. De lo contrario, está a merced de la precisionopción de configuración de PHP (para "mostrar"), que no es lo suficientemente alta por defecto a partir de PHP 7.0, lo que provoca una pérdida de precisión (no precisa hasta el microsegundo).
Aquí hay un enfoque un poco más corto. En lugar de trabajar para crear una fecha / hora numérica de alta precisión, convierto el valor del microsegundo en una cadena, elimino el 0y lo agrego al final de la cadena de fecha / hora. Puedo recortar fácilmente el número de decimales ajustando el parámetro de longitud de la cadena; aquí utilizo 4para obtener milisegundos, pero podrías usar 7para obtener microsegundos.
$t = explode(" ",microtime());
echo date("m-d-y H:i:s",$t[1]).substr((string)$t[0],1,4);
Para un valor de microtime () de 0.98236000 1407400573, esto regresa 08-07-14 01:08:13.982.
echo date('m-d-Y H:i:s').substr(fmod(microtime(true), 1), 1);
ejemplo de salida:
02-06-2019 16:45:03.53811192512512
Si necesita limitar el número de posiciones decimales, la siguiente línea (mgutt de crédito) sería una buena alternativa. (Con el siguiente código, el 6 limita el número de posiciones decimales a 6.)
echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));
ejemplo de salida:
02-11-2019 15:33:03.624493
echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));. Explicación por qué necesitamos 09: stackoverflow.com/a/28739819/318765
echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
substr()no se redondea. Y en combinación con round()él cortaría los ceros finales: stackoverflow.com/questions/7493305/… Esa es la razón por la que propuse sprintf().
Si desea formatear una fecha como la de JavaScript (new Date()).toISOString()por alguna razón, así es como puede hacerlo en PHP:
$now = microtime(true);
gmdate('Y-m-d\TH:i:s', $now).sprintf('.%03dZ',round(($now-floor($now))*1000));
Salida de muestra:
2016-04-27T18:25:56.696Z
Solo para demostrar que restar el número entero no reduce la precisión de la parte decimal:
>>> number_format(123.01234567890123456789,25)
=> "123.0123456789012408307826263"
>>> number_format(123.01234567890123456789-123,25)
=> "0.0123456789012408307826263"
PHP hizo alrededor de las cifras decimales, redondeada pero ellos de la misma manera en ambos casos.
date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));?
$timeya está en milisegundos, sí, eso técnicamente funcionaría. No me encanta el substrtruco, pero supongo que funcionaría para fechas entre 2001 y 2286.
$timees EM, pero ¿qué pasa? 2286Quiero decir, ¿por qué creo eso y cómo sería posible escapar de ella?
Esto se basa en la respuesta de ArchCodeMonkey.
Pero simplificado, si solo quieres algo rápido que funcione.
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()));
}
Entonces para mi entonces
$now = DateTime_us();
$now->format("m-d-Y H:i:s.u");
A partir de PHP 7.1, simplemente puede hacer esto:
$date = new DateTime( "NOW" );
echo $date->format( "m-d-Y H:i:s.u" );
Se mostrará como:
04-11-2018 10:54:01.321688
La documentación dice lo siguiente:
Microsegundos (agregado en PHP 5.2.2). Tenga en cuenta que date () siempre generará 000000 ya que toma un parámetro entero, mientras que DateTime :: format () admite microsegundos.
Es decir, use DateTime en su lugar.
new DateTime()también devolverán 0000 para u. Pero si le proporciona un tiempo de precisión de microsegundos al crear una instancia, funciona bien.
new DateTime( 'Y-m-d H:i:s.'.$micro);
Con PHP 7.0+ ahora aquí puede hacer lo siguiente:
$dateString = substr($millseconds_go_here,0,10);
$drawDate = new \DateTime(Date('Y-m-d H:i',$dateString));
$drawDate->setTimezone(new \DateTimeZone('UTC'));
Esto hace lo siguiente en orden:
Date() poder manejar la fecha.DateTime()luego puede permitirle modificar la zona horaria en la que se encuentra, pero asegúrese de que date_default_timezone_set("Timezone");esté configurado antes de usarDateTime() funciones y clases.DateTime()se usan clases o funciones.si está utilizando Carbon, puede utilizar la especificación definida "RFC3339_EXTENDED". o personalizarlo.
Carbon::RFC3339_EXTENDED = 'Y-m-d\TH:i:s.vP';
Basado en la respuesta de @ArchCodeMonkey.
Si tiene declare(strict_types=1), debe lanzar el segundo argumento a la cadena
Me lancé a la banca de diferentes maneras:
1) microtime + sscanf + fecha:
sscanf(microtime(), '0.%6s00 %s', $usec, $sec);
$date = date('Y-m-d H:i:s.', $sec) . $usec;
No estoy seguro de por qué microtime () devuelve 10 caracteres (0.dddddd00) para la parte de microsegundos, pero tal vez alguien pueda decirme.
$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-> formato:
$now = new DateTime('NOW');
$date = $now->format('Y-m-d H:i:s.u');
no funciona en 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-> formato:
$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-> formato:
$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)