背景:有时候需求需要计算从今天开始的5个月之后应该是哪一天。而跨年、每个月有大小月,或者月份中可能有28/29天,而PHP的strtotime的+n month有可能就不准确了(如:2月28日加三个月,需求可能想到5月31日,而strtotime出来则是5月28日)。为解决这个问题,方法如下 方法一:
/** * @param $currTime * 计算的时间 时间戳 * @param $month * 增加的月份 */
public static function get_year_to_curtime($currTime,$month,$isDay = 1) { $currY = date('Y',$currTime); $currM = date('m',$currTime); $day = date('d',$currTime); $futureYm=strtotime('+'.$month.'month',strtotime($currY.'-'.$currM)); $futureMonthTotalDay = date( 't',$futureYm); if ($day > $futureMonthTotalDay){ $day = $futureMonthTotalDay; } // 需求29409 解决商城与DMS时间不一致问题,DMS为前一天,因此商城也需要往前推一天 return strtotime(date('Y-m',$futureYm).'-'.$day.'23:59:59') - 86400; }
方法二: public static function get_year_to_curtime($currTime,$month) { $currY = date('Y',$currTime); $currM = date('m',$currTime); $currD = date('d',$currTime); $nextY = $currY; $nextM = $currM + $month; if ($nextM > 12){ $nextM = $nextM%12; $nextY = intval($nextM/12) + $currY; } if (in_array($nextM,[1,3,5,7,8,10,12]) && in_array($currD,[28,29,30,31])){ $nextD = 31; }elseif(in_array($nextM,[4,6,7,9,11]) && in_array($currD,[28,29,30,31])){ $nextD = 30; }elseif($nextM == 2 && in_array($currD,[28,29,30,31])){ $nextD = date("t", mktime(20,20,20,2,1,$nextY)); }else{ $nextD = $currD; } return strtotime($nextY.'-'.$nextM.'-'.$nextD); }