判断两个日期是否周期变化:如开始日期为每个月1号,判断结束日期是否也是1号;若结束日期也是1号,则是周期变化。适用场景:如每年或每个月套餐定期扣费。
<?PHP
/**
* @function 判断两个日期是否周期变化
* @param date $start_date 开始日期
* @param date $end_date 结束日期
* @param string $type 周期类型:Y 以1年为周期 M 以1个月为周期
* @return boolean ture/false
*/
function is_date_cycle($start_date, $end_date, $type){
//开始日期
$start_date = getdate(strtotime($start_date));
$start_year = $start_date['year'];
$start_month = $start_date['mon'];
$start_day = $start_date['mday'];
//结束日期
$end_date = getdate(strtotime($end_date));
$end_year = $end_date['year'];
$end_month = $end_date['mon'];
$end_day = $end_date['mday'];
//1.1以月为周期:若同年且同月,则在同一周期,即未周期变化
if($type == 'M' && ($start_year == $end_year && $start_month == $end_month)){
return false;
}
//1.2以年为周期:若同年或不同月,则未周期变化
if($type == 'Y' && ($start_year == $end_year || $start_month != $end_month)){
return false;
}
//2.排除第1点,若两个日子相同,则是周期变化
if($start_day == $end_day){
return true;
}
//3.排除第2点,若是两个日子不同,不同月份也可能是周期变化
//3.1 二月份的闰月判断
if($end_month == 2 && $start_day >= 29){
if(($end_year%4 == 0 && $end_year%100 != 0) || ($end_year%400 == 0)){
if($end_day == 29){
return true;
}
}else{
if($end_day == 28){
return true;
}
}
}
//3.2 三十天的月份判断
$middle_month = array(4, 6, 9, 11);
if(in_array($end_month, $middle_month) && $start_day >= 31){
if($end_day == 30){
return true;
}
}
//4.其他则不是周期变化
return false;
}