2009-07-31 21 views
11

Esto funcionaba bien ayer sin cambios en el código.PHP Strtotime -1meses -2meses

echo date("M", strtotime("-3 month", time())); 
echo date("M", strtotime("-2 month", time())); 
echo date("M", strtotime("-1 month", time())); 
echo date("M", time()); 

La salida se producía ayer fue como era de esperar- es decir, abril, mayo, junio, julio

Hoy en día se hace eco de mayo de mayo jul jul

¿Alguna idea?

Gracias de antemano.

+3

Hoy, somos el 31; puede haber algo relacionado con esa ^^ –

Respuesta

11

Podría estar relacionado con fallo #44073

Usted podría intentar con algo como esto:

echo date("M", strtotime("-3 month", strtotime(date("F") . "1"))) . "\n"; 
echo date("M", strtotime("-2 month", strtotime(date("F") . "1"))) . "\n"; 
echo date("M", strtotime("-1 month", strtotime(date("F") . "1"))) . "\n"; 
echo date("M", time()) . "\n"; 

(Solución encontrada en la sección de comentarios de strtotime; direct link)

Y el salida:

Apr 
May 
Jun 
Jul 

especie de "trampa" con el formato de fecha y el nombre del mes y todo eso ...

4

Prueba este lugar de strtotime:

mktime(0, (date("n") - 3 + 12) % 12, 1) 

La idea es tomar el número del mes actual (date("n")), reste la cantidad de meses que desee (aquí -3), agréguele 12 y luego obtenga el módulo 12.

+0

buena solución, muy limpio –

3

Esto es un comportamiento conocido y esperado. La razón para esto es que un mes es una fecha relativa sin longitud fija. De http://www.gnu.org/software/tar/manual/html_node/Relative-items-in-date-strings.html#SEC120

La unidad de desplazamiento de tiempo se puede seleccionar con la cadena 'año' o 'mes' para moverse por años o meses enteros. Estas son unidades difusas, ya que los años y meses no tienen la misma duración. Las unidades más precisas son "quincena", que vale 14 días, "semana" vale 7 días, "día" vale 24 horas, "hora" vale 60 minutos, "minuto" o "minuto" vale 60 segundos, y "segundo" o 'sec' vale un segundo. El sufijo 's' en estas unidades es aceptado e ignorado.

consecuencia (énfasis)

la pelusa en unidades puede causar problemas con artículos relativos. Por ejemplo, '2003-07-31 -1 month' podría evaluar a 2003-07-01, porque 2003-06-31 es una fecha no válida. Para determinar el mes anterior de manera más confiable, puede solicitar el mes anterior al día 15 del mes actual.Por ejemplo:

$ date -R 
Thu, 31 Jul 2003 13:02:39 -0700 
$ date --date='-1 month' +'Last month was %B?' 
Last month was July? 
$ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!' 
Last month was June! 

Lo anterior podría expresarse en PHP como

echo date('M', strtotime(date('Y-m-') . '15 -1 month')); 

Ver también los commments debajo http://bugs.php.net/bug.php?id=22486

0

una manera simple podría ser escribir como este

echo date ("M", strtotime ("este año +3 meses"));

o

fecha de eco ("M", strtotime ("este mes -3 meses"));

depende de lo que su uso para ..

7

Gorden identificó correctamente el tema, pero quería dar otra solución que ha sido útil y no como técnico. Solo use "primer día de" o "último día de" en su tiempo de ocio. Ex, estos ejemplos siguientes superar el problema en un 31 de un mes:

// Today is May 31st 
//All the following return 2012-04-30 
echo date('Y-m-d', strtotime("last day of -1 month")); 
echo date('Y-m-d', strtotime("last day of last month")); 
echo date_create("last day of -1 month")->format('Y-m-d'); 

// All the following return 2012-04-01 
echo date('Y-m-d', strtotime("first day of -1 month")); 
echo date('Y-m-d', strtotime("first day of last month")); 
echo date_create("first day of -1 month")->format('Y-m-d'); 
2

Desde PHP 5.3 (Ref: https://bugs.php.net/bug.php?id=44073) y más alto que puede hacer:

"first day of +1 month" o "first day of next month" o incluso " last day of next month "

Ejemplo:

$date = '2015-12-31'; 

echo date("Y-m-d", strtotime($date ."first day of previous month")); 

producirá: 2015-11-01 Esto no calcula días en +30 días base de tiempo.

Cuestiones relacionadas