PHP比较两个日期相隔多少年,多少月,多少天

2017-09-07 PHP常用方法 820 WGE

日期比较通常会出现在OA系统比较多,比如计算一个员工的工龄情况,需要返回x年x月x日,又或者是计算该员工的生日倒计时,需要返回剩余x天等,下面分享一个精确到多少天的函数。

/*
 * 比较两个日期相隔多少年,多少月,多少天
 * @param String $date 日期
 * @param String $thanDate 比较的日期
 * @param String $type 返回类型 ymd返回年月日 md返回月日 d返回日
 * @param Array $format 返回格式 ['year'=>'年', 'month'=>'月', 'day'=>'天']
 * @return Array $str 字符串
 * @return Array $array 数组
 **/
function dateDiff($date, $thanDate, $type="d", $format=[]){

    // 判断日期格式是否正确
    $reg = '/^(19|20)\d\d-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/';
    $condition = preg_match($reg, $date);
    $condition2 = preg_match($reg, $thanDate);
    if(!$condition||!$condition2){
        return false;
    }

    // 输出格式
    $format = !empty($format) ? $format : ['year'=>'年', 'month'=>'月', 'day'=>'天'];

    $diff = strtotime($date) - strtotime($thanDate);
    $diff = abs($diff);

    $returnStr = "";
    $returnArr = [];

    // 默认年月日转换时间戳
    $y = 60*60*24*365; // 默认一年365天
    $m = 60*60*24*30; // 默认一月30天
    $d = 60*60*24;

    switch($type){
    	case 'ymd':
    	    $year = floor($diff / $y);
    	    $month = floor(($diff-$year*$y) / $m);
    	    $day = ceil(($diff-$year*$y-$month*$m)/$d);

    	    $returnArr = ['year'=>$year, 'month'=>$month, 'day'=>$day];
    	    $returnStr = $year.$format['year'].$month.$format['month'].$day.$format['day'];
    	break;
    	
    	case 'md':
    	    $month = floor($diff / $m);
    	    $day = ceil(($diff-$month*$m)/$d);

    	    $returnArr = ['month'=>$month, 'day'=>$day];
    	    $returnStr = $month.$format['month'].$day.$format['day'];
    	break;

        // 默认输出天
    	default:
            $result = $diff / (60*60*24);
            $returnStr = ceil($result).$format['day'];// 向上取整
            $returnArr = ['day'=>$result];
            //$returnStr = floor($result);// 向下取整
            //$returnStr = round($result, 2);// 保留小数
    }

    return [
        'str'=>$returnStr,
        'array'=>$returnArr
    ];

}

该函数使用方法如下:

$format = ['year'=>'年', 'month'=>'月', 'day'=>'天'];

// $type非必填,默认返回相隔多少天
// $format非必填,默认返回x年x月x天
dateDiff("2017-05-01", "2025-08-01", 'ymd', $format);

// $date,$thanDate两个日期没有顺序之分,也可以前者大后者小
dateDiff("2025-05-01", "2017-08-01", 'ymd', $format);