2011-05-27 14 views
9

Me hago eco de esto:obtener el ISO 8601 con segundos.de fracción decimal de segundo fecha en php?

php> echo date("Y-m-d\TH:i:s"); 
     2011-05-27T11:21:23 

¿Cómo se puede hacer con la función de la fecha para conseguir este formato de fecha:

2011-01-12T14:41:35.7042252+01:00 (por ejemplo)

35.7042252 => seconds.decimal fracción de segundo

que he intentado:

php> function getTimestamp() 
... { 
...   return date("Y-m-d\TH:i:s") . substr((string)microtime(), 1, 8); 
... } 

php> echo getTimestamp(); 
2011-05-27T15:34:35.6688370 // missing +01:00 how can I do? 

Respuesta

9
date('Y-m-d\TH:i:s.uP') 

u para microsegundos se agregó en PHP 5.2.2. Para más temprano o más (todavía) versiones rotas (ver comentarios):

date('Y-m-d\TH:i:s') . substr(microtime(), 1, 8) . date('P') 

O, para evitar dos llamadas a date:

date(sprintf('Y-m-d\TH:i:s%sP', substr(microtime(), 1, 8))) 
+0

funciona ahora, gracias – newbie

+0

sí, pero la fecha ('Ymd \ TH: i: s.uP') tiene una fecha de eco error ('Ymd \ TH: i: s.uP'); => 2011 -05-27T15: 55: 31.000000 + 02: 00 – newbie

+0

Silly PHP. Ir por 'microtime' luego. :) – deceze

3

Mejor actuación:

substr_replace(date('c'), substr(microtime(), 1, 8), 19, 0); 
4

Haciendo las llamadas de [fecha] por separado tienen una pequeña posibilidad de que las dos marcas de tiempo estén desordenadas: por ejemplo, la fecha de la llamada a la 1: 29: 22.999999 y la de la mircotime a la 1: 29: 23.000001. En mi servidor, las llamadas consecutivas están separadas por 10 personas.

Source

Tal vez puedas probar:

list($usec, $sec) = explode(" ", microtime()); 
echo date("Y-m-d\TH:i:s", $sec) . substr($usec, 1, 8) . date("P", $sec); 

Ej:

2015-07-19T16:59:16.0113674-07:00 
+0

el enlace 'fuente' hace referencia al código de Lucky que contiene errores. Vea esta respuesta para las correcciones :) http://stackoverflow.com/a/38334226/614616 – hozza

-1

Si analizar la cadena devuelta por microtime hace que vomita en la boca, y no lo hace quiere múltiples marcas de tiempo diferentes conectadas en su salida, puede hacer esto:

$unow = microtime(true); 
sprintf("%s.%06d%s", date("Y-m-d\TH:i:s", $unow), ($unow - floor($unow))*1e6, date("P", $unow)); 
+0

Esto falla aproximadamente el 10% del tiempo cuando 'microtime()' es menor que '0.1' ya que no lo hace left-0 -relleno. P.ej. '.0272390' se mostrará como' .272390'. – jchavannes

+0

Eso no es un "fracaso" precisamente, pero sí. Editado para arreglar, trivialmente. – jab

Cuestiones relacionadas