Es extraño que la pregunta pida convertir milisegundos , pero todos responden cómo convertir microsegundos. Sé que puede convertir entre ambos, pero en realidad responder a la pregunta en lugar de copiar y pegar código no relacionado del documento PHP o de otro lugar sería bueno.
Microsegundos (agregado en PHP 5.2.2). Tenga en cuenta que date()siempre generará, 000000ya que toma un parámetro entero, mientras DateTime::format()que admite microsegundos si DateTimese creó con microsegundos.
Por lo general, opto por el segundo formulario, ya que es más fácil de leer y comprender. Además, DateTime es mucho más flexible y robusto que las funciones de fecha / hora. El manejo de microsegundos es un buen ejemplo.
Herbert
3
@Geo y AlBundy, ¿podría ser que esté probando esto en una máquina con php <5.2.2? PHP 5.4.39 ejecuta esto perfectamente bien ...
RichardBernards
¿No sería esto fácil? fecha ('mdY H: i: s'). (int) microtime (verdadero);
Anant
@Anant, sería bastante fácil, de hecho. Pero mal. ;) Lo que obtienes allí es solo la época en segundos. (Desafortunadamente, tampoco funcionaría con microtime(false)ninguno).
Sz.
Este código no funciona correctamente en todas las configuraciones regionales. Algunos países como Alemania escriben "0,1234" o "0.1234" en lugar de ".1234", por lo que su código me da el siguiente resultado: 2012-07-08 11:14:15.0.889342
Daniel Marschall
138
Puede hacer esto fácilmente con el formato de entrada U.u.
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 ...
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).
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.
Nota: DateTime::createFromFormat('U.u', microtime(true));devolverá falso si se microtime(true)ejecuta en el segundo exacto. Devuelve '1438616239' en lugar de '1438616239.000000'.
giggsey
1
Gran solución, gracias. Parece que estoy perdiendo mi hora local creando $ ahora a partir de microtiempo. ¿Alguna idea?
Viernes
1
@daVe He agregado información sobre zonas horarias, espero que eso sea lo que buscabas.
ArchCodeMonkey
1
El 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).
Teoh Han Hui
1
Siempre desplácese hacia abajo en StackOverflow
tom10271
15
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.
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.)
Perdiste la precisión y el cero inicial durante unos segundos. Entonces la versión correcta debería ser 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
mgutt
Te perdiste la precisión de nuevo;)echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
mgutt
Pero ojo, 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().
mgutt
@mgutt ¿Cuándo el primer dígito no sería cero? Básicamente, lo que se necesita es simplemente eliminar el cero que siempre está ahí cuando se obtiene el resto de fmod en 1. La pregunta pide microsegundos pero en forma de lugares decimales de los segundos. No hay razón para limitar el número de decimales. Más lugares decimales es simplemente mejor precisión.
ghbarratt
@mgutt Agregué su primera alternativa sugerida a mi respuesta, explicando que esa sería una buena manera de limitar el número de lugares decimales si es necesario
ghbarratt
3
Si desea formatear una fecha como la de JavaScript (new Date()).toISOString()por alguna razón, así es como puede hacerlo en PHP:
No. No use matemáticas en el número de punto flotante, es inexacto. Además, no pierda el tiempo llamando a varias funciones. Simplemente use substr () para truncar la fecha formateada a tres lugares decimales.
LS
@LS Truncating no redondeará el tercer decimal, que probablemente sea aún más inexacto. Los flotadores no se rompen hasta que no consigues precisiones muy pequeñas; 3 lugares decimales deberían estar bien. En realidad, no creo que esté alterando la precisión en absoluto, los flotadores se vuelven más precisos cuanto más te acercas a 0. Restar el número entero no debería alterar los lugares decimales AFAIK.
mpen
¿Qué hay de date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));?
F8ER
@ F8ER Si $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.
mpen
Sí, $timees EM, pero ¿qué pasa? 2286Quiero decir, ¿por qué creo eso y cómo sería posible escapar de ella?
F8ER
3
Esto se basa en la respuesta de ArchCodeMonkey.
Pero simplificado, si solo quieres algo rápido que funcione.
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.
Sí, según la respuesta anterior (y mis pruebas) 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.
scipilot
@scipilot ok, ¿cómo lo haces?
Geo
@Geo vea la respuesta aceptada. new DateTime( 'Y-m-d H:i:s.'.$micro);
Recorta los últimos 4 ceros de la cuerda para Date() poder manejar la fecha.
Utiliza la fecha para formatear los milisegundos en una cadena de fecha y hora que DateTime pueda comprender.
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.
Es una buena práctica usar un constructor en tus clases para asegurarte de que estás en la zona horaria correcta cuando DateTime()se usan clases o funciones.
Respuestas:
php.net dice:
Así que use tan simple:
dateTime()
Clase recomendada y de uso de la referencia:La nota
u
es microsegundos (1 segundo = 1000000 µs).Otro ejemplo de php.net :
Referencia de
dateTime()
en php.netRespondí 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
fuente
microtime(false)
ninguno).2012-07-08 11:14:15.0.889342
Puede hacer esto fácilmente con el formato de entrada
U.u
.Esto produce la siguiente salida:
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 ...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 de
createFromFormat()
) 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:
Produce la siguiente salida:
Tenga en cuenta que si desea ingresar en mysql, el formato de hora debe ser:
fuente
DateTime::createFromFormat('U.u', microtime(true));
devolverá falso si semicrotime(true)
ejecuta en el segundo exacto. Devuelve '1438616239' en lugar de '1438616239.000000'.number_format
siempre es necesario, incluso cuando no está en el segundo exacto. De lo contrario, está a merced de laprecision
opció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
0
y 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í utilizo4
para obtener milisegundos, pero podrías usar7
para obtener microsegundos.Para un valor de microtime () de
0.98236000 1407400573
, esto regresa08-07-14 01:08:13.982
.fuente
Estoy usando
fuente
ejemplo de salida:
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.)
ejemplo de salida:
fuente
echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));
. Explicación por qué necesitamos09
: stackoverflow.com/a/28739819/318765echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
substr()
no se redondea. Y en combinación conround()
él cortaría los ceros finales: stackoverflow.com/questions/7493305/… Esa es la razón por la que propusesprintf()
.Si desea formatear una fecha como la de JavaScript
(new Date()).toISOString()
por alguna razón, así es como puede hacerlo en PHP:Salida de muestra:
Solo para demostrar que restar el número entero no reduce la precisión de la parte decimal:
PHP hizo alrededor de las cifras decimales, redondeada pero ellos de la misma manera en ambos casos.
fuente
date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));
?$time
ya está en milisegundos, sí, eso técnicamente funcionaría. No me encanta elsubstr
truco, pero supongo que funcionaría para fechas entre 2001 y 2286.$time
es EM, pero ¿qué pasa?2286
Quiero 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.
Entonces para mi entonces
fuente
Aquí hay otro método que encuentro un poco más elegante / simple:
fuente
fuente
A partir de PHP 7.1, simplemente puede hacer esto:
Se mostrará como:
fuente
La documentación dice lo siguiente:
Es decir, use DateTime en su lugar.
fuente
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:
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 quedate_default_timezone_set("Timezone");
esté configurado antes de usarDateTime()
funciones y clases.DateTime()
se usan clases o funciones.fuente
si está utilizando Carbon, puede utilizar la especificación definida "RFC3339_EXTENDED". o personalizarlo.
fuente
Basado en la respuesta de @ArchCodeMonkey.
Si tiene
declare(strict_types=1)
, debe lanzar el segundo argumento a la cadenafuente
Me lancé a la banca de diferentes maneras:
1) microtime + sscanf + fecha:
No estoy seguro de por qué microtime () devuelve 10 caracteres (0.dddddd00) para la parte de microsegundos, pero tal vez alguien pueda decirme.
2) DateTime :: createFromFormat + Datetime-> formato:
no funciona en PHP 5.x ...
3) gettimeofday + date:
-
4) microtime + number_format + DateTime :: createFromFormat + DateTime-> formato:
-
5) microtime + sprintf + DateTime :: createFromFormat + DateTime-> formato:
-
fuente