2012-03-02 7 views
5

Noté que strtotime() maneja las marcas de tiempo Unix de una manera extraña, y tenía curiosidad si alguien sabe por qué es así:¿Por qué una indicación de fecha y hora de Unix necesita un prefijo '@' para strtotime() para entenderlo?

var_export(strtotime('1330725042')); // false 
var_export(strtotime('@1330725042')); // 1330725042 

¿Por qué strtotime() retorno false cuando se le da una marca de tiempo Unix (a menos que dicha marca de tiempo es prefijado por @)?

Esto es desde el interior de un método de biblioteca que he creado que está destinado a "resolver" una variable de formato desconocido en una marca de tiempo. Usar un strtotime() desnudo no es útil en este caso porque devuelve el resultado incorrecto cuando el valor entrante en realidad es una marca de tiempo.

He vuelto a trabajar el método de la biblioteca para hacer una comprobación explícita de un valor similar a la marca de tiempo y devolverlo sin modificar, por lo que hay ... diremos, ya no hay aplicación práctica para esta pregunta; Tengo curiosidad.

+4

Porque la documentación lo dice :) http://www.php.net/manual/en/datetime.formats.compound.php No creo que un entero sea un formato válido de fecha/hora – Tchoupi

+0

+1 para ese enlace Mathieu. Me imaginé que había documentos * en algún lado *. – Josh

+0

Gracias. De hecho, no tenía idea de que una marca de tiempo de Unix podría ser un formato válido de DateTime de PHP. – Tchoupi

Respuesta

5

La cadena que strtotime() recibe debe tener un formato específico. http://www.php.net/manual/en/datetime.formats.php

Si strtotime() no reconoce el formato de entrada, devuelve FALSE. Como el tiempo Unix es solo una secuencia de números, no puede analizarlos correctamente a menos que especifiques explícitamente qué formato estás usando. Poner un @ al inicio da a la función la instrucción de que esta secuencia está en formato de tiempo Unix.

Para obtener más información, aquí está la documentación: http://php.net/manual/en/function.strtotime.php

+2

Gracias por los enlaces. He encontrado esto: 'Unix Timestamp \t "@" "-"? [0-9] + \t "@ 1215282385" 'en http://php.net/datetime.formats.compound –

1

Porque strtotime significa cadena a tiempo y su "1330725042" no es una cadena de tiempo, sino una marca de tiempo Unix entre comillas.

strtotime() se utiliza para valores como "2 de marzo de 2012".

Si ya tiene 1330725042 como valor de indicación de fecha y hora de unix, ¿por qué necesita usar strtotime()?

+0

WRT por qué llamar a 'strtotime()' en una marca de tiempo, la motivación detrás de esta pregunta son situaciones en las que el código no sabe el valor ya es una marca de tiempo. He actualizado mi pregunta con más información. –

+0

Es posible que esté utilizando la biblioteca de alguien que llama strtotime en lo que suministra, y tiene una marca de tiempo. – derekdreery

1

strtotime() genera la marca de tiempo, y su parámetro debe representarse por fecha de texto, por lo que lo está utilizando incorrectamente.

2

Probablemente porque strtotime convierte en una marca de tiempo UNIX, por lo que no está esperando uno como parámetro.

Leer more

0

strtotime no reconoce las marcas de tiempo UNIX, pero es inglés Fechas lisos o tiempo relativo (como "1 día" o "1 mes")

la @ antes del valor seguramente desencadenar la " ignore el error "modo de php dentro de la llamada, (efecto secundario interesante) permitiendo que el valor irreparable sea devuelto al volcado de var.

+0

'" @ 1215282385 "' es en realidad un formato válido Eche un vistazo al enlace en los comentarios. – Josh

+0

Lamentablemente, tengo que -1 esto, ya que la presencia de '@' no tiene nada que ver con la supresión de un error en este caso; es solo parte del [formato documentado de PHP para Unix timestamps] (http://php.net/datetime.formats.compound). –

0

Todos los demás son correctos en el uso de la función y que acepta una cadena y no una cadena de marca de tiempo. Sin embargo, si obtiene resultados utilizando un signo @, es probable que sea un operador el que signifique que el siguiente texto es una marca de tiempo O que la función omite errores según el uso estándar de @ de PHP.

De cualquier modo, ¿por qué quieres strtotime a timestamp?

+0

WRT por qué llamar a 'strtotime()' en una marca de tiempo, la motivación detrás de esta pregunta son las situaciones donde el código no sabe que el valor ya es una marca de tiempo He actualizado mi pregunta con más información. –

+0

Desafortunadamente, tengo que -1 esto, ya que la presencia de '@' no tiene nada que ver con la supresión de un error en este caso; es solo parte del [formato documentado de PHP para marcas de tiempo de Unix] (http://php.net/datetime.formats.compound). –

0

strtotime() está destinado a convertir un formato de fecha en inglés en una marca de tiempo unix, por lo que proporcionar una marca de tiempo unix en lugar de un formato de fecha no sería un uso válido de esta función. formatos de fecha y hora aceptadas se pueden ver en el manual de PHP en http://php.net/manual/en/datetime.formats.php

0

La respuesta es que una de las principales @ significa un formato de fecha marca de tiempo Unix, mientras que un número entero en sí misma es un formato de fecha no válida. ver: http://php.net/manual/en/datetime.formats.compound.php

Por qué strtotime('@1 a') da un resultado no-erróneo de -3599 sin embargo, no tengo ni idea. lol

Cuestiones relacionadas