/**
*根据$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月之前的这一天的两种算法,布布扣,bubuko.com
PHP实现指定时间的n月之前的这一天的两种算法