fecha - PHP date() y strtotime() devuelven meses incorrectos el día 31
strtotime php (4)
Intente usar el "primer día de" en su tiempo de ocio, así:
strtotime("first day of +1 month");
Esto arreglará las fechas (en caso de que el día de hoy fuera el 30 de enero), como 02-30 (rendimientos, 2 de marzo) al convertirlo en 02-01 (1 de febrero), que luego le indica el mes correcto. Es un poco más limpio que otros métodos y es más fácil de recordar.
Estoy usando las funciones date()
y strtotime()
para mostrar los próximos 3 meses en una lista desplegable.
Código PHP:
echo date("m/Y",strtotime("+0 months"));
echo date("m/Y",strtotime("+1 months"));
echo date("m/Y",strtotime("+2 months"));
Sin embargo, si la secuencia de comandos se ejecuta cuando la fecha del servidor es 30 o 31, el mes siguiente, que es Feburary, se mostrará en marzo. es decir, se supone que el guión anterior debe regresar
01/2012
02/2012
03/2012
Pero, en lugar de eso, en realidad muestra
01/2012
03/2012
03/2012
eso es porque Feburary no tiene 30 o 31, por lo que el guión traduce "31/02" a "01/03".
He leído la página de strtotime()
en php.net, este problema se ha planteado, pero no ha habido ninguna solución útil. Entonces, ¿alguien puede ayudarme a encontrar una forma simple de resolver este problema? ¡Gracias por adelantado!
No use strtotime () para obtener la fecha de compensación por mes (es). Funciona correctamente solo en PHP 5.3+. La mejor forma de resolver ese problema es usar mktime () . A continuación se muestra un código de muestra:
function getOffsetByMonths($nMonths, $nNow = 0) {
if ($nNow)
return mktime(0, 0, 0, date(''n'', $nNow)+ $nMonths, 1, date(''Y'', $nNow));
else
return mktime(0, 0, 0, date(''n'')+ $nMonths);
}
$nNow = mktime(0, 0, 0, 1, 31, 2013);
echo "Now: ". date("Y-m-d", $nNow).
"<br>(Now - 1 month): ". date("Y-m", getOffsetByMonths(-1, $nNow)). "-xx".
"<br>(Now - 2 month): ". date("Y-m", getOffsetByMonths(-2, $nNow)). "-xx".
"<br>(Now - 3 month): ". date("Y-m", getOffsetByMonths(-3, $nNow)). "-xx";
Como se menciona en la documentación, debe pasar la fecha del primer día del mes actual como el segundo parámetro de la función strtotime()
:
$base = strtotime(date(''Y-m'',time()) . ''-01 00:00:01'');
echo date(''m/Y'',strtotime(''+0 month'', $base));
echo date(''m/Y'',strtotime(''+1 month'', $base));
echo date(''m/Y'',strtotime(''+2 month'', $base));
Ver que funcione: http://ideone.com/eXis9
01/2012
02/2012
03/2012
echo date(''m/Y'', strtotime(date(''Y-m'') . ''-01 +2 months''));
Solo codifíquelo para ser el primero del mes.