如何使用PHP找到两个日期之间的天数?
当前回答
我已经尝试了答案中几乎所有的方法。但是DateTime和date_create在所有测试用例中都没有给出正确答案。特别在2月和3月或12月和1月进行测试。
所以,我想出了混合溶液。
public static function getMonthsDaysDiff($fromDate, $toDate, $includingEnding = false){
$d1=new DateTime($fromDate);
$d2=new DateTime($toDate);
if($includingEnding === true){
$d2 = $d2->modify('+1 day');
}
$diff = $d2->diff($d1);
$months = (($diff->format('%y') * 12) + $diff->format('%m'));
$lastSameDate = $d1->modify("+$months month");
$days = date_diff(
date_create($d2->format('Y-m-d')),
date_create($lastSameDate->format('Y-m-d'))
)->format('%a');
$return = ['months' => $months,
'days' => $days];
}
我知道,性能方面这是相当昂贵的。你也可以把它扩展到年限。
其他回答
使用这个简单的函数。声明函数
<?php
function dateDiff($firstDate,$secondDate){
$firstDate = strtotime($firstDate);
$secondDate = strtotime($secondDate);
$datediff = $firstDate - $secondDate;
$output = round($datediff / (60 * 60 * 24));
return $output;
}
?>
像这样调用这个函数
<?php
echo dateDiff("2018-01-01","2018-12-31");
// OR
$firstDate = "2018-01-01";
$secondDate = "2018-01-01";
echo dateDiff($firstDate,$secondDate);
?>
看看所有的答案,我写了一个通用函数,适用于所有的PHP版本。
if(!function_exists('date_between')) :
function date_between($date_start, $date_end)
{
if(!$date_start || !$date_end) return 0;
if( class_exists('DateTime') )
{
$date_start = new DateTime( $date_start );
$date_end = new DateTime( $date_end );
return $date_end->diff($date_start)->format('%a');
}
else
{
return abs( round( ( strtotime($date_start) - strtotime($date_end) ) / 86400 ) );
}
}
endif;
一般来说,我使用“DateTime”来查找两个日期之间的天数。但如果出于某种原因,一些服务器设置没有启用'DateTime',它将使用'strtotime()'简单(但不安全)计算。
易于使用date_diff
$from=date_create(date('Y-m-d'));
$to=date_create("2013-03-15");
$diff=date_diff($to,$from);
print_r($diff);
echo $diff->format('%R%a days');
详见:https://blog.devgenius.io/how-to-find-the-number-of-days-between-two-dates-in-php-1404748b1e84
如果你使用的是PHP 5.3 >,这是目前为止最准确的计算绝对差值的方法:
$earlier = new DateTime("2010-07-06");
$later = new DateTime("2010-07-09");
$abs_diff = $later->diff($earlier)->format("%a"); //3
如果你需要一个相对的(带符号的)天数,可以用这个代替:
$earlier = new DateTime("2010-07-06");
$later = new DateTime("2010-07-09");
$pos_diff = $earlier->diff($later)->format("%r%a"); //3
$neg_diff = $later->diff($earlier)->format("%r%a"); //-3
更多关于php的DateInterval格式可以在这里找到:https://www.php.net/manual/en/dateinterval.format.php
$early_start_date = date2sql($_POST['early_leave_date']);
$date = new DateTime($early_start_date);
$date->modify('+1 day');
$date_a = new DateTime($early_start_date . ' ' . $_POST['start_hr'] . ':' . $_POST['start_mm']);
$date_b = new DateTime($date->format('Y-m-d') . ' ' . $_POST['end_hr'] . ':' . $_POST['end_mm']);
$interval = date_diff($date_a, $date_b);
$time = $interval->format('%h:%i');
$parsed = date_parse($time);
$seconds = $parsed['hour'] * 3600 + $parsed['minute'] * 60;
// display_error($seconds);
$second3 = $employee_information['shift'] * 60 * 60;
if ($second3 < $seconds)
display_error(_('Leave time can not be greater than shift time.Please try again........'));
set_focus('start_hr');
set_focus('end_hr');
return FALSE;
}
推荐文章
- 解析日期字符串并更改格式
- 原则-如何打印出真正的sql,而不仅仅是准备好的语句?
- 如何从关联PHP数组中获得第一项?
- PHP/MySQL插入一行然后获取id
- 我如何排序一个多维数组在PHP
- 如何在PHP中截断字符串最接近于一定数量的字符?
- PHP错误:“zip扩展名和unzip命令都没有,跳过。”
- Nginx提供下载。php文件,而不是执行它们
- Json_encode()转义正斜杠
- 在Java中转换字符串到日历对象
- 如何在PHP中捕获cURL错误
- ZoneOffset之间的区别是什么。UTC和ZoneId.of(“UTC”)?
- 如何要求一个分叉与作曲家?
- 如何检查DST(日光节约时间)是否有效,如果是,偏移量?
- 如何在php中创建可选参数?