/** *根据$endtime,返回指定$monthes月之前的日 */ function severalMonthAgo($endtime,$monthes){ if (!$endtime) { return false; } if (!is_int($monthes) || $monthes <=0) { return false; } $m = date("m",$endtime); $y = date("Y",$endtime); $d = date("d",$endtime); $year = floor($monthes/12); $monthes_mod = $monthes%12; if($year == 0){ //<12个月 if($m < $monthes){ //当前月份小于n月前 $res_y = $y-1; $res_m = 12-($monthes-$m); $t = date("t",strtotime($res_y."-".$res_m."-01")); if($d<$t){ $res_d = $d; }else{ $res_d = $t; } }elseif($m == $monthes){ $res_y = $y-1; $res_m = 12; $t = date("t",strtotime($res_y."-".$res_m."-01")); if($d<$t){ $res_d = $d; }else{ $res_d = $t; } }elseif($m>$monthes){ $res_y = $y; $res_m = $m-$monthes; $t = date("t",strtotime($res_y."-".$res_m."-01")); if($d<$t){ $res_d = $d; }else{ $res_d = $t; } } }elseif($year>0){ $y = $y-$year; $monthes = $monthes_mod; if($m < $monthes){ //当前月份小于n月前 $res_y = $y-1; $res_m = 12-($monthes-$m); $t = date("t",strtotime($res_y."-".$res_m."-01")); if($d<$t){ $res_d = $d; }else{ $res_d = $t; } }elseif($m == $monthes){ $res_y = $y-1; $res_m = 12; $t = date("t",strtotime($res_y."-".$res_m."-01")); if($d<$t){ $res_d = $d; }else{ $res_d = $t; } }elseif($m>$monthes){ $res_y = $y; $res_m = $m-$monthes; $t = date("t",strtotime($res_y."-".$res_m."-01")); if($d<$t){ $res_d = $d; }else{ $res_d = $t; } } } return strtotime($res_y."-".$res_m."-".$res_d); } /** *根据$endtime,返回指定$monthes月之前的日 */ function severalMonthAgoEx($endtime,$monthes){ if (!$endtime) { return false; } if (!is_int($monthes) || $monthes <=0) { return false; } $m = date("m",$endtime); $y = date("Y",$endtime); $d = date("d",$endtime); $year = floor($monthes/12); $monthes_mod = $monthes%12; $y -= $year; //$year =0或>0; //$monthes_mod =0或>0或 if ($year>0) { if ($monthes_mod>0) { $m_diff = 12+$m-$monthes_mod; $m_diff_div = floor($m_diff/12); $m_diff_mod = $m_diff%12; if ($m_diff_div > 0) { $res_y = $y; $res_m = $m_diff_mod; }elseif ($m_diff_div == 0) { $res_y = $y -1; $res_m = $m_diff_mod; } }elseif ($monthes_mod==0) { //整除 $res_y = $y; $res_m = $m; } }elseif ($year == 0) { $m_diff = 12+$m-$monthes_mod; $m_diff_div = floor($m_diff/12); $m_diff_mod = $m_diff%12; if ($m_diff_div > 0) { $res_y = $y; }elseif ($m_diff_div == 0) { $res_y = $y -1; } $res_m = $m_diff_mod; } $t = date("t",strtotime($res_y."-".$res_m."-01")); if($d<$t){ $res_d = $d; }else{ $res_d = $t; } return strtotime($res_y."-".$res_m."-".$res_d); }
PHP实现指定时间的n月之前的这一天的两种算法
时间: 2024-10-10 20:06:34