w3schools hora con php strtotime php-5.5

hora - ¿El resultado de Strtotime no tiene sentido, error de PHP?



strtotime php hora (3)

La siguiente línea:

echo date(''d'', strtotime(''First Saturday August 2015''));

imprime 08 , lo que no parece tener ningún sentido porque la primera vez que ocurre un día de la semana no puede ser posterior al 7º.

¿Es un error de php o un error de php o tal vez incluso un error de php? No lo sé...

versión php: 5.5.19


Como se dijo, PHP no entendió muy bien su elección de dialecto. Si planea aceptar una entrada variada de sus usuarios (no es una mala idea) para expresar una fecha, sugiero que realice una normalización de esa entrada del usuario para que pueda enviar un formato predecible a strtotime.



Actualización # 1: se explica a continuación la gran diferencia que una simple palabra como " of " hace, después de que investigué un poco en el código fuente de PHP.

Actualización # 2: En realidad hay una página de documentación en el manual de PHP que explica los formatos de fechas aceptadas por strftime() . Simplemente no estaba al tanto de eso hasta ahora. Gracias @Outspaced por proporcionar el enlace en su respuesta.

Para una lectura rápida y fácil, omita la sección Actualización # 1 .

La respuesta inicial:

En efecto,

echo date(''Y-m-d'', strtotime(''First Saturday August 2015''));

huellas dactilares:

2015-08-08

Pero

echo date(''Y-m-d'', strtotime(''First Saturday of August 2015''));

imprime la fecha correcta:

2015-08-01

Como strtotime() trata de "entender" el inglés, supongo que usted y su idioma hablan diferentes dialectos :-)

Actualización # 1:

Después de leer el código fuente PHP de la función strtotime() , creo que analiza el First Saturday August 2015 como el First Saturday seguido de August 2015 .

August 2015 es una expresión absoluta y porque no hay ninguna indicación sobre el día en que se produce el 2015-08-01 (el 1 de agosto de 2015), lo que es una estimación razonable (la única posible, creo).

First Saturday es una expresión relativa . Es relativo a una marca absoluta provista en la cadena ( August 2015 ) o como un segundo parámetro de strtotime() y "shifts" la marca de tiempo de la marca absoluta hacia atrás o hacia adelante con cierta cantidad.

Poniéndolos juntos, strtotime() interpreta el First Saturday August 2015 como el First Saturday cuenta desde August 1, 2015 y, de hecho, August 8, 2015 .

Por otro lado, el First Saturday of August 2015 se analiza utilizando una regla diferente . Uno de los next , last , previous , this o cualquier número ordinal desde el first hasta el twelfth , seguido de un nombre de día de la semana (completo o abreviado) y seguido de of se analiza como un día de la semana del mes proporcionado (o el mes actual si no se proporciona ninguno) en la cadena).

Actualización # 2

Después de descubrir que el formato de la cadena aceptada por strtotime() se explica en realidad en la documentación de PHP, la explicación se volvió más simple. Eche un vistazo a la segunda casilla " Nota: " en la página de documentación .

First Saturday August 2015 se explica en el artículo # 4 de la nota:

"nombre del día ordinal" avanza a otro día.

First Saturday of August 2015 se explica en el artículo # 6 de la nota:

"nombre de día ordinal ''de''" no avanza a otro día.

La nota termina con un bloque completo de explicaciones dedicado a la palabra mágica " of ".