找到PHP的月份差异?

Kar*_*hik 11 php datetime date

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

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

dec*_*eze 69

没有重新发明轮子的最简单方法.这将给你完整的月份差异.即以下两个日期差不多 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";
Run Code Online (Sandbox Code Playgroud)

  • 谨慎使用!2013年1月1日至2013年3月31日之间的月份差异将为2个月(预期不是3个!) (4认同)
  • @noobie请[RTFM查询`DateInterval :: format`](http://php.net/manual/en/dateinterval.format.php)查找所有可能的格式选项. (2认同)

Val*_*spa 20

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

/**
 * 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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 01.11.2013 - 30.11.2013 - 1个月
  • 01.01.2013 - 2013年12月31日 - 12个月
  • 2011年1月31日 - 2011年2月28日 - 1个月
  • 01.09.2009 - 01.05.2010 - 8个月
  • 01.01.2013 - 2013年3月31日 - 3个月
  • 15.02.2013 - 2013年4月15日 - 2个月
  • 01.02.1985 - 2013年12月31日 - 347个月

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

例如:

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


MaX*_*MaX 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;
Run Code Online (Sandbox Code Playgroud)


CLW*_*ill 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;
}
Run Code Online (Sandbox Code Playgroud)

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


Tow*_*wer -8

这是一个快速的:

$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);
Run Code Online (Sandbox Code Playgroud)

  • 两个日期相距越远,这将变得越来越不准确,并且最终可能会以错误的方式四舍五入...... (26认同)
  • 如果月份有“31 天”(如果是“一月”、“三月”、“五月”、“七月”、“八月”、“十月”、“十二月”)或“28 天”(如果是“二月”),会发生什么,因为你除以 30。 (7认同)