2011-11-11 9 views
5

esperaba que este funcional devuelva 6/30/2005 en lugar de 7/1/2005.php: strtotime ("31/12/2004 +6 mes")); no devolviendo el último día de junio

print date("m/d/Y", strtotime("12/31/2004 +6 month")); 

Del mismo modo, print date("m/d/Y", strtotime("1/31/2011 +1 month")) vuelve 03/03/2011 mientras que le gustaría volver 2/28/2011.

¿Alguien sabe si hay una manera directa de mostrar el último día del mes agregado?

+0

'strtotime' funciona con fechas de estilo europeo, si no recuerdo mal. intente '31/1/2011', etc. –

Respuesta

6

¿Qué tal esto?

echo date("m/d/Y", strtotime("last day of 12/31/2004 + 6 month")); // 6/30/2005 
echo date("m/d/Y", strtotime("last day of 1/31/2011 + 1 month")); // 2/28/2011 

Demo

Editar: Para su referencia, aquí hay un enlace a la documentation for relative times.

0

Una manera simple es ir un mes antes del día que desea y luego hacer día valor cero. Además, mktime() podría ser más fácil

$mymonth = 2; // I want the last day of February 
echo date('m/d/Y', mktime(0,0,0,$mymonth+1,0,2011)); 

Esto debería devolver el 2/28/2011.

2

como strtotime continúan en el mes que viene si no hay días enoghe ese mes, puede realizar copias de 6 meses y comprobar si su fin en la fecha de inicio

$date2 = date("Y-m-d", strtotime("{$date} +6 months")); 
    $date3 = date("Y-m-d", strtotime("{$date2} -6 months")); 
    if($date3 != $date) 
    { 
    $date2 = date("Y-m-t", strtotime("{$date2} -1 months")); 
    } 

(o en su caso " m/t/Y ")

0

strtotime hace lo mejor que puede con información contradictoria. Diciendo

1/31/2011 +1month 

significaría avanzar a

2/31/2011 

pero febrero, sólo tiene 28 veces (29) días. 2011 no es un año bisiesto, por lo que el "31 de febrero" se normaliza al "3 de marzo".

Lo mismo se aplica para '12/31/2004 + 6month '. Eso te lleva al 31 de junio de 2005. Pero junio solo tiene 30 días, por lo que la fecha se normaliza para el 1 de julio.

Cuestiones relacionadas