PHP - 如何计算从特定日期开始的月份数量

4
我该如何使用过程式编程方式计算以下两个日期之间的月数?
PHP代码。
$delete_date = "2000-01-12 08:02:39";
$current_date = date('Y-m-d H:i:s'); //current date

你想要计算两个日期之间的月数吗? - John Parker
是的,这正是我在寻找的。 - HELP
5个回答

7
你正在寻找DateTime::diff吗?

$delete_date = "2000-01-12 08:02:39";
$date_format = 'Y-m-d H:i:s';
$current_date = date($date_format);
$diff = date_diff(date_create_from_format($date_format, $delete_date), date_create());
$months = $diff->m;

Something along the lines of that.


3

使用DateTime可以这样获取总月数:

$d1 = new DateTime("2000-01-12 08:02:39");
$d2 = new DateTime();
$d3 = $d1->diff($d2);
$months = ($d3->y*12)+$d3->m;

你仍然需要处理剩余的天数 $d3->d ... 但这取决于你的需求。


0
$delete_date = "2000-01-12 08:02:39";
$current_date = date('Y-m-d H:i:s'); //current date

$diff = strtotime($current_date) - strtotime($delete_date);
$months = floor(floatval($diff) / (60 * 60 * 24 * 365 / 12));
echo $months . "\n";

我怀疑有一些边缘情况会导致返回错误的值。(每个月的天数不是恰好365/12天。) - John Parker
@middaparka说:这可能会在2月1日至3月2日之间造成麻烦。但是,不清楚OP需要多精确,所以也许没问题。 - Pekka
这完全取决于问题的上下文。我们可以认为每个月有30天,或者365/12=30.41666天每个月,这样可以吗?此外:使用floorroundceil来四舍五入月份计数可以吗? - scoffey
1
它确实不取决于问题的上下文 - 错误答案始终是错误的答案。 - John Parker
@middaparka 嗯,我认为它确实有用。例如,如果它是以月为单位的年龄,那么计算“floor”就可以了。如果它是你欠债的月数,你可能想要计算“ceil”来得到一个悲观的估计,以便知道你需要支付多少钱。也许你甚至不想四舍五入月份差异,而是将其用作比较的偏移量,包括表示天数的小数部分。你能否更具体地说明这个月份计数是用来做什么的,以及为什么这个标准解决方案(参见:https://dev59.com/nnRB5IYBdhLWcg3wQVSV)可能是错误的? - scoffey

0

这是你在寻找的吗?

$delete_date = "2000-01-12 08:02:39";
$current_date = date('Y-m-d H:i:s'); //current date

// convert date to int
$delete_date = strtotime($delete_date);
$current_date = strtotime($current_date);

// calculate it
$diff = $delete_date - $current_date;

// convert int to time
$conv_diff = date('format', $diff);

我在寻找类似于1个月、10个月、40个月等的东西。 - HELP

-3

试试这个,很容易,可能不够高级,但非常有效。

function calculateMonthsBetweenDates($fMonth, $fDay, $fYear, $tMonth, $tDay, $tYear)
{
    //Build datetime vars using month, day and year
    $dateFrom = mktime(0, 0, 0, $fMonth, $fDay, $fYear);
    $dateTo   = mktime(0, 0, 0, $tMonth, $tDay, $tYear);

    //Check dateTo is a later date than dateFrom.
    if($dateFrom<=$dateTo){
        $yearF  = date("Y", $dateFrom);
        $yearT  = date("Y", $dateTo);
        $monthF = date("m", $dateFrom);
        $monthT = date("m", $dateTo);

        //same year
        if ($yearF == $yearT)
            $months = ($monthT - $monthF);
        else{
        //different year
            $months = (12*($yearT-$yearF)-$monthF) + $monthT;
            }
        return $months;
        }
    else
       return false; //or -1
}

这段代码无法正确计算不同年份之间的日期。 例如,它会说2000年1月1日和2000年12月1日之间有11个月,但是它会说2000年1月1日和2014年1月1日之间有12个月! - Rosamunda
抱歉,Rosamunda,我已经修复了。现在它适用于任何日期。 - Rubén Carrasco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接