我有两个表格日期:
Start Date: 2007-03-24
End Date: 2009-06-26
现在我需要通过以下形式找到这两者之间的区别:
2 years, 3 months and 2 days
如何在PHP中执行此操作?
我有两个表格日期:
Start Date: 2007-03-24
End Date: 2009-06-26
现在我需要通过以下形式找到这两者之间的区别:
2 years, 3 months and 2 days
如何在PHP中执行此操作?
当前回答
我想带来一个稍微不同的视角,这似乎没有被提及。
你可以用声明的方式解决这个问题(就像任何其他问题一样)。重点是问你需要什么,而不是如何到达那里。
在这里,你需要与众不同。但这有什么不同?这是一个间隔,正如在最受欢迎的答案中所提到的。问题是如何获取它。您可以不显式调用diff()方法,而是按开始日期和结束日期创建一个间隔,即按日期范围:
$startDate = '2007-03-24';
$endDate = '2009-06-26';
$range = new FromRange(new ISO8601DateTime($startDate), new ISO8601DateTime($endDate));
所有诸如闰年之类的复杂问题都已经解决了。现在,当您有一个固定开始日期时间的间隔时,您可以获得一个人类可读的版本:
var_dump((new HumanReadable($range))->value());
它输出的正是你所需要的。
如果您需要一些自定义格式,这也不是问题。您可以使用ISO8601格式化类,该类接受具有六个参数的调用:年、月、日、小时、分钟和秒:
(new ISO8601Formatted(
new FromRange(
new ISO8601DateTime('2017-07-03T14:27:39+00:00'),
new ISO8601DateTime('2018-07-05T14:27:39.235487+00:00')
),
function (int $years, int $months, int $days, int $hours, int $minutes, int $seconds) {
return $years >= 1 ? 'More than a year' : 'Less than a year';
}
))
->value();
它的产量超过一年。
有关此方法的更多信息,请查看快速入门条目。
其他回答
您还可以使用以下代码通过向上舍入分数来返回日期差异$date1=$duedate;//指定到期日echo$date2=日期(“Y-m-d”);//当前日期$ts1=字符串时间($date1);$ts2=字符串时间($date2);$seconds_diff=$ts1-$ts2;echo$datediff=ceil(($seconds_diff/3600)/24);//天内返回
如果您使用php的floor方法而不是ceil,它将返回舍入分数。请检查此处的差异,有时,如果您的临时服务器时区与现场站点时区不同,在这种情况下,您可能会得到不同的结果,因此请相应地更改条件。
简单的功能
function time_difference($time_1, $time_2, $limit = null)
{
$val_1 = new DateTime($time_1);
$val_2 = new DateTime($time_2);
$interval = $val_1->diff($val_2);
$output = array(
"year" => $interval->y,
"month" => $interval->m,
"day" => $interval->d,
"hour" => $interval->h,
"minute" => $interval->i,
"second" => $interval->s
);
$return = "";
foreach ($output AS $key => $value) {
if ($value == 1)
$return .= $value . " " . $key . " ";
elseif ($value >= 1)
$return .= $value . " " . $key . "s ";
if ($key == $limit)
return trim($return);
}
return trim($return);
}
像这样使用
回波时间差($time_1,$time_2,“天”);
将返回2年8个月2天
function showTime($time){
$start = strtotime($time);
$end = strtotime(date("Y-m-d H:i:s"));
$minutes = ($end - $start)/60;
// years
if(($minutes / (60*24*365)) > 1){
$years = floor($minutes/(60*24*365));
return "From $years year( s ) ago";
}
// monthes
if(($minutes / (60*24*30)) > 1){
$monthes = floor($minutes/(60*24*30));
return "From $monthes monthe( s ) ago";
}
// days
if(($minutes / (60*24)) > 1){
$days = floor($minutes/(60*24));
return "From $days day( s ) ago";
}
// hours
if(($minutes / 60) > 1){
$hours = floor($minutes/60);
return "From $hours hour( s ) ago";
}
// minutes
if($minutes > 1){
$minutes = floor($minutes);
return "From $minutes minute( s ) ago";
}
}
echo showTime('2022-05-05 21:33:00');
您可以使用
getdate()
函数,该函数返回包含所提供日期/时间的所有元素的数组:
$diff = abs($endDate - $startDate);
$my_t=getdate($diff);
print("$my_t[year] years, $my_t[month] months and $my_t[mday] days");
如果开始和结束日期为字符串格式,则使用
$startDate = strtotime($startDateStr);
$endDate = strtotime($endDateStr);
在上述代码之前
$date = '2012.11.13';
$dateOfReturn = '2017.10.31';
$substract = str_replace('.', '-', $date);
$substract2 = str_replace('.', '-', $dateOfReturn);
$date1 = $substract;
$date2 = $substract2;
$ts1 = strtotime($date1);
$ts2 = strtotime($date2);
$year1 = date('Y', $ts1);
$year2 = date('Y', $ts2);
$month1 = date('m', $ts1);
$month2 = date('m', $ts2);
echo $diff = (($year2 - $year1) * 12) + ($month2 - $month1);