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);