我试图计算两个日期之间的差异,但是以更具体的方式计算。
例如,我有两个日期: 2017-11-01 和 2018-01-31 我需要的是 3个月。这意味着,这两个日期之间有3个完整的结算月份。
这是它应该如何运作的:
我在DateTime类中尝试过diff方法,它产生的东西并没有多大帮助。这是一个例子
<?php
$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-31 00:00:00');
$diff = $date1->diff($date2);
print_r($diff)
result:
DateInterval Object
(
[y] => 0
[m] => 2
[d] => 30
[h] => 0
[i] => 0
[s] => 0
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] => 91
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)
显示2个月和30天。
然而,情况略有不同
$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-30 00:00:00');
这两个日期之间的差异应该显示2个月和30天,而不是3个月。
非常感谢任何帮助或想法。
答案 0 :(得分:2)
在进行比较之前,在结束日期添加一天。如果原始结束日期是该月的最后一天,则新的结束日期将滚动到下个月,您将在diff对象中获得正确的“完整”月数。如果原件是但那一天的最后一天,则不会更改结果。
$start = '2017-11-01';
$end = '2018-01-31';
$date1 = DateTime::createFromFormat('Y-m-d', $start);
$date2 = DateTime::createFromFormat('Y-m-d', $end)->add(new DateInterval('P1D'));
echo $date1->diff($date2)->m, "\n";
答案 1 :(得分:0)
似乎你在计算过程中失去了一天。因为你需要几个月的间隔,包括第一天/最后一天 - 然后你应该把这一天添加到间隔。
所以,这种情况下的解决方案是:
$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-31 23:59:59');
$diff = $date1->diff($date2);
或:
$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-10-31 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-31 00:00:00');
$diff = $date1->diff($date2);
甚至:
$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-02-01 00:00:00');
$diff = $date1->diff($date2);
答案 2 :(得分:0)
使用碳:
Carbon::parse('2017-10-31')->diffInMonths(Carbon::now());