找到PHP的月份差异?

时间:2010-04-21 09:08:28

标签: php datetime date

有没有办法在PHP中找到月份差异?我有从2003-10-17到2004-03-24的输入。我需要找到这两天内有多少个月。比如说6个月,我只需要几个月的输出。感谢您指导我一天的差异。

我通过My​​SQL找到解决方案,但我需要在PHP中使用它。有人帮助我,提前谢谢。

13 个答案:

答案 0 :(得分:63)

没有重新发明轮子的最简单方法。这将为您提供完整月份差异。即以下两个日期几乎相隔76个月,但结果是75个月。

date_default_timezone_set('Asia/Tokyo');  // you are required to set a timezone

$date1 = new DateTime('2009-08-12');
$date2 = new DateTime('2003-04-14');

$diff = $date1->diff($date2);

echo (($diff->format('%y') * 12) + $diff->format('%m')) . " full months difference";

答案 1 :(得分:19)

在测试了大量的解决方案后,将所有解决方案全部用于单元测试,这就是我提出来的:

/**
 * Calculate the difference in months between two dates (v1 / 18.11.2013)
 *
 * @param \DateTime $date1
 * @param \DateTime $date2
 * @return int
 */
public static function diffInMonths(\DateTime $date1, \DateTime $date2)
{
    $diff =  $date1->diff($date2);

    $months = $diff->y * 12 + $diff->m + $diff->d / 30;

    return (int) round($months);
}

例如,它将返回(来自单元测试的测试用例):

  • 01.11.2013 - 30.11.2013 - 1个月
  • 01.01.2013 - 2013年12月31日 - 12个月
  • 31.01.2011 - 28.02.2011 - 1个月
  • 01.09.2009 - 01.05.2010 - 8个月
  • 01.01.2013 - 31.03.2013 - 3个月
  • 15.02.2013 - 15.04.2013 - 2个月
  • 01.02.1985 - 31.12.2013 - 347个月

注意:由于它与日期的四舍五入,甚至半个月都会四舍五入,如果你在某些情况下使用它可能会导致问题。所以不要在这种情况下使用它,它会引起你的问题。

例如:

  • 02.11.2013 - 2013年12月31日将返回2,而不是1(如预期的那样)。

答案 2 :(得分:7)

我只是想添加这个,如果有人正在寻找一个简单的解决方案,计算每个触及的月份,而不是完整的几个月,几个月或类似的东西。

// Build example data
$timeStart = strtotime("2003-10-17");
$timeEnd = strtotime("2004-03-24");
// Adding current month + all months in each passed year
$numMonths = 1 + (date("Y",$timeEnd)-date("Y",$timeStart))*12;
// Add/subtract month difference
$numMonths += date("m",$timeEnd)-date("m",$timeStart);

echo $numMonths;

答案 3 :(得分:6)

哇,想要解决问题的方法......这个版本怎么样:

function monthsBetween($startDate, $endDate) {
    $retval = "";

    // Assume YYYY-mm-dd - as is common MYSQL format
    $splitStart = explode('-', $startDate);
    $splitEnd = explode('-', $endDate);

    if (is_array($splitStart) && is_array($splitEnd)) {
        $difYears = $splitEnd[0] - $splitStart[0];
        $difMonths = $splitEnd[1] - $splitStart[1];
        $difDays = $splitEnd[2] - $splitStart[2];

        $retval = ($difDays > 0) ? $difMonths : $difMonths - 1;
        $retval += $difYears * 12;
    }
    return $retval;
}

注意:与其他几个解决方案不同,这不依赖于PHP 5.3中添加的日期函数,因为许多共享主机还没有。

答案 4 :(得分:2)

http://www.php.net/manual/en/datetime.diff.php

这将返回一个具有格式方法的DateInterval对象。

答案 5 :(得分:0)

<?php
  # end date is 2008 Oct. 11 00:00:00
  $_endDate = mktime(0,0,0,11,10,2008);
  # begin date is 2007 May 31 13:26:26
  $_beginDate = mktime(13,26,26,05,31,2007);

  $timestamp_diff= $_endDate-$_beginDate +1 ;
  # how many days between those two date
  $days_diff = $timestamp_diff/2635200;

?>

参考:http://au.php.net/manual/en/function.mktime.php#86916

答案 6 :(得分:0)

function monthsDif($start, $end)
{
    // Assume YYYY-mm-dd - as is common MYSQL format
    $splitStart = explode('-', $start);
    $splitEnd = explode('-', $end);

    if (is_array($splitStart) && is_array($splitEnd)) {
        $startYear = $splitStart[0];
        $startMonth = $splitStart[1];
        $endYear = $splitEnd[0];
        $endMonth = $splitEnd[1];

        $difYears = $endYear - $startYear;
        $difMonth = $endMonth - $startMonth;

        if (0 == $difYears && 0 == $difMonth) { // month and year are same
            return 0;
        }
        else if (0 == $difYears && $difMonth > 0) { // same year, dif months
            return $difMonth;
        }
        else if (1 == $difYears) {
            $startToEnd = 13 - $startMonth; // months remaining in start year(13 to include final month
            return ($startToEnd + $endMonth); // above + end month date
        }
        else if ($difYears > 1) {
            $startToEnd = 13 - $startMonth; // months remaining in start year 
            $yearsRemaing = $difYears - 2;  // minus the years of the start and the end year
            $remainingMonths = 12 * $yearsRemaing; // tally up remaining months
            $totalMonths = $startToEnd + $remainingMonths + $endMonth; // Monthsleft + full years in between + months of last year
            return $totalMonths;
        }
    }
    else {
        return false;
    }
}

答案 7 :(得分:0)

// get year and month difference

$a1 = '20170401';

$a2 = '20160101'

$yearDiff = (substr($a1, 0, 4) - substr($a2, 0, 4));

$monthDiff = (substr($a1, 4, 2) - substr($a2, 4, 2));

$fullMonthDiff = ($yearDiff * 12) + $monthDiff;

// fullMonthDiff = 16

答案 8 :(得分:0)

这是@deceze答案的增强版本:

 /**
 * @param string $startDate
 * Current date is considered if empty string is passed
 * @param string $endDate
 * Current date is considered if empty string is passed
 * @param bool $unsigned
 * If $unsigned is true, difference is always positive, otherwise the difference might be negative
 * @return int
 */
public static function diffInFullMonths($startDate, $endDate, $unsigned = false)
{
    $diff = (new DateTime($startDate))->diff(new DateTime($endDate));
    $reverse = $unsigned === true ? '' : '%r';
    return ((int) $diff->format("{$reverse}%y") * 12) + ((int) $diff->format("{$reverse}%m"));
}

答案 9 :(得分:0)

最好的方法。

leadsheet.id

结果:

function getIntervals(DateTime $from, DateTime $to)
{
    $intervals = [];
    $startDate = $from->modify('first day of this month');
    $endDate = $to->modify('last day of this month');
    while($startDate < $endDate){
        $firstDay = $startDate->format('Y-m-d H:i:s');
        $startDate->modify('last day of this month')->modify('+1 day');
        $intervals[] = [
            'firstDay' => $firstDay,
            'lastDay' => $startDate->modify('-1 second')->format('Y-m-d H:i:s'),
        ];
        $startDate->modify('+1 second');
    }
    return $intervals;
}
$dateTimeFirst = new \DateTime('2013-01-01');
$dateTimeSecond = new \DateTime('2013-03-31');
$interval = getIntervals($dateTimeFirst, $dateTimeSecond);
print_r($interval);

答案 10 :(得分:0)

在我的情况下,我需要计算整月和剩余的剩余时间,以构建折线图标签。

/**
 * Calculate the difference in months between two dates
 *
 * @param \DateTime $from
 * @param \DateTime $to
 * @return int
 */
public static function diffInMonths(\DateTime $from, \DateTime $to)
{
    // Count months from year and month diff
    $diff = $to->diff($from)->format('%y') * 12 + $to->diff($from)->format('%m');

    // If there is some day leftover, count it as the full month
    if ($to->diff($from)->format('%d') > 0) $diff++;

    // The month count isn't still right in some cases. This covers it.
    if ($from->format('d') >= $to->format('d')) $diff++;
}

答案 11 :(得分:0)

$datetime1 = date_create('2009-10-11');

$datetime2 = date_create('2013-1-13');

$interval = date_diff($datetime1, $datetime2);

echo $interval->format('%a day %m month %y year');

答案 12 :(得分:-5)

这是一个快速的:

$date1 = mktime(0,0,0,10,0,2003); // m d y, use 0 for day
$date2 = mktime(0,0,0,3,0,2004); // m d y, use 0 for day

echo round(($date2-$date1) / 60 / 60 / 24 / 30);