有没有一种很好的方法来计算没有日期的日期之间的月份差异?我的意思是我有两个不完整的日期,例如: 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”。只有年份和月份。
答案 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
答案 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"