Dentro de la función hay comentarios y pongo un ejemplo de uso debajo.
En ésta no contemplo los años bisiestos... si alguien encuentra una función mejor que la publique.
Código PHP:
<?php
function restarMeses($fecha='0', $cantMeses=1, $formato=2){
//***********************************************************//
// Si no se indica $fecha se toma la fecha actual por defecto//
// Si no se indica $cantMeses se toma 1 por defecto //
// Si no se indica $formato se toma 2 por defecto //
// formato 1: DD/MM/YYYY //
// formato 2: YYYY-MM-DD (toma este por defecto)//
// Nota: No se contemplan los años bisiesto //
//***********************************************************//
$d = 1; $m = 1; $y = 1900; if($formato==1){ if($fecha=='0'){
$fecha = date('d/m/Y'); } $f = split('/', $fecha); $d = $f[0];
$m = $f[1]; $y = $f[2]; }else if($formato==2){ if($fecha=='0'){
$fecha = date('Y-m-d'); }$f = split('-', $fecha); $d = $f[2];
$m = $f[1]; $y = $f[0]; }if($formato == 1 || $formato==2){
for($i=1;$i<=$cantMeses;$i++){ if(($m-1)==0){ $m = 12;
$y = $y-1; }else{ $m = $m-1; }} if($d==31){
if($m==11 || $m==9 || $m==6 || $m==4){ $d = 30; }else if($m==2){
$d = 29; }}else if($d==30 && $m==2){$d = 29;}if($d<10){
$d = "0".$d;}if($m<10){ $m = "0".$m;}if($formato==1){
$fecha = $d."/".$m."/".$y;}else if($formato==2){
$fecha = $y."-".$m."-".$d;}return $fecha;}else{
return "error en formato seleccionado";}
}
//EJEMPLO DE USO
echo restarMeses('31/12/2008', 3, 1);
echo "<br/>";
echo restarMeses('2008-1-20', 5, 2);
?>