计算没有日期的日期之间的月份差异

时间:2018-12-06 17:21:58

标签: php date diff

有没有一种很好的方法来计算没有日期的日期之间的月份差异?我的意思是我有两个不完整的日期,例如: 2017-09和2018-11。我需要计算这两个日期之间有多少个月。我读到一些有关的内容,并且知道可以使用:

$firstDate = "2017-09";
$secondDate = "2018-11";
$firstDate = new DateTime($firstDate . "-01"); 
$secondDate  = new DateTime($secondDate . "-01");
$interval = date_diff($firstDate, $secondDate);

var_dump($interval->format('%m months'));exit();

这告诉我2个月。  我怎样才能做到这一点?有没有一种方法可以在不增加日期“ -01”的情况下将其计算在内? 我想计算日期的月份差异,而在此日期中不写“ -01”。只有年份和月份。

4 个答案:

答案 0 :(得分:1)

还需要岁月。
另外,您在2017-0901的日期存在解析错误,该错误在2017-09或2017-09-01均无效。

$firstDate = "2017-09";
$secondDate = "2018-11";
$firstDate = new DateTime($firstDate); 
$secondDate  = new DateTime($secondDate);
$interval = date_diff($firstDate, $secondDate);

echo $interval->format('%y')*12+$interval->format('%m') . " months";
// 14 months

https://3v4l.org/XGdXg

答案 1 :(得分:1)

只需使用普通算术即可。我们显然不关心时区,夏时制,日历更改等,因此我们也不关心“根据某个日历在某个时区中”解析日期。我们剩下的只是简单的算术,用了几个月。一年是12个月。现在我们几乎已经完成了。

function ym_as_months($v) {
  $v = array_map("intval", explode("-", $v));
  return $v[0]*12 + $v[1];
}

$firstDate = "2017-09";    
$firstMonths = ym_as_months($firstDate);

$secondDate = "2018-11";    
$secondMonths = ym_as_months($secondDate);

$diff = $secondMonths - $firstMonths;
echo "There are $diff months between $firstDate and $secondDate.";

然后我们得到:

  

2017-09年至2018-11年之间有14个月。

完美。

当然,根据您如何在应用程序中获取这些日期戳,甚至不将它们作为字符串传递,而是简单地将两个数字一起传递可能会更容易。在这种情况下,工作量将减少。

或者,按照another answer here,在最后一步进行转换。

答案 2 :(得分:0)

我建议使用Carbon来进行PHP中与日期相关的计算,因为它确实使一切变得容易。

要使用Carbon来计算两个日期之间的月份,只需执行此操作

//year & month
$startDate = Carbon::create('2017', '9');
$endDate = Carbon::create('2018','11');
$diff = $startDate->diffInMonths($endDate);

答案 3 :(得分:-1)

https://secure.php.net/manual/en/datetime.createfromformat.php

$a = DateTime::createFromFormat('Y-m', '2017-09');
$b = DateTime::createFromFormat('Y-m', '2018-11');
$diff = $a->diff($b);

var_dump(
    $a, $b,
    $diff->format("%y years, %m months"),
    sprintf("%d months", $diff->y * 12 + $diff->m)
);

输出:

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2017-09-06 18:33:58.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(16) "Europe/Amsterdam"
}
object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2018-11-06 18:33:58.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(16) "Europe/Amsterdam"
}
string(17) "1 years, 2 months"
string(9) "14 months"