一尘不染

一种获取两个日期之间的月数的优雅方法?

php

假设我在变量中有两个日期,例如

$date1 = "2009-09-01";
$date2 = "2010-05-01";

我需要获取介于$date2$date1$date2 >= $date1)之间的月份数。即我需要得到8

有没有一种方法可以通过使用日期函数来获取它,或者我必须爆炸字符串并进行一些计算?

非常感谢


阅读 290

收藏
2020-05-26

共1个答案

一尘不染

对于PHP> = 5.3

$d1 = new DateTime("2009-09-01");
$d2 = new DateTime("2010-05-01");

var_dump($d1->diff($d2)->m); // int(4)
var_dump($d1->diff($d2)->m + ($d1->diff($d2)->y*12)); // int(8)

DateTime ::
diff返回一个DateInterval对象

如果您未使用PHP 5.3或更高版本运行,我想您将不得不使用unix时间戳:

$d1 = "2009-09-01";
$d2 = "2010-05-01";

echo (int)abs((strtotime($d1) - strtotime($d2))/(60*60*24*30)); // 8

但这不是很精确(每月并不总是30天)。

最后一件事:如果这些日期来自您的数据库,请使用DBMS而不是PHP来完成此工作。

编辑: 如果您不能使用DateTime :: diff或RDBMS,则此代码应该更精确:

$d1 = strtotime("2009-09-01");
$d2 = strtotime("2010-05-01");
$min_date = min($d1, $d2);
$max_date = max($d1, $d2);
$i = 0;

while (($min_date = strtotime("+1 MONTH", $min_date)) <= $max_date) {
    $i++;
}
echo $i; // 8
2020-05-26