我使用DateTime::diff
比较两个DateTime
,但结果很奇怪,好像abs($date1 - $date2) != abs($date2 - $date1)
。
$date1 = new DateTime("1980-11-21 00:00:00");
$date2 = new DateTime("1981-11-20 00:00:00");
var_dump($date1->diff($date2,true)->days);
var_dump($date2->diff($date1,true)->days);
var_dump($date1->diff($date2,true)->format("%Y-%m-%d %H:%i:%s"));
var_dump($date2->diff($date1,true)->format("%Y-%m-%d %H:%i:%s"));
哪个返回:
int(364)
int(364)
string(15) "00-11-30 00:0:0"
string(15) "00-11-29 00:0:0"
行为正确。两个日期间隔代表相同的天数(364)。月和日期部分表示从第一个日期到第二个日期需要加/减的期间:
1981-11-20 minus 1980-11-21 represents an interval of 11 month 30 day
1980-11-21 + 11 month = 1981-10-21
1981-10-21 + 30 day = 1981-10-21
1980-11-21 minus 1981-11-20 represents an interval of 11 month 29 day
1981-11-20 - 11 month = 1980-12-20
1980-12-20 - 29 day = 1980-11-21
一个简单的例子是10月21日至12月20日:
为什么不从最大值中减去最小值?伪代码:
$diff = max($date1, $date2) - min($date1, $date2)
这样,您应该始终获得相同和正确的结果。
结果似乎是有线的,但是是正确的:有30或31(或28)天的几个月来解释。如果您要在十月执行此示例]
$date1 = new DateTime("1980-10-21 00:00:00");
$date2 = new DateTime("1981-10-20 00:00:00");
var_dump($date1->diff($date2,true)->format("%Y-%m-%d %H:%i:%s"));
var_dump($date2->diff($date1,true)->format("%Y-%m-%d %H:%i:%s"));
var_dump($date1->diff($date2,true)->format("%Y-%m-%d %H:%i:%s") == $date2->diff($date1,true)->format("%Y-%m-%d %H:%i:%s"));
string(15) "00-11-29 00:0:0"
string(15) "00-11-30 00:0:0"
bool(false)
或二月
string(15) "00-11-30 00:0:0"
string(15) "00-11-28 00:0:0"
bool(false)
还
var_dump($date1->diff($date2,true)->format("%a"));
将始终显示
string(3) "365"
好,请仅陈述我的评论作为答案。我的猜测是这是预期的行为,因为它的天数不同,具体取决于您前进还是后退。想象一下,从昨天到今天超过一年,那是366天,因为您必须四舍五入whole year plus 1 day
。出于同样的原因,从今天到昨天(去年)只有364天,为whole year minus one day
。至于解决方案,@ Andreas建议的选项是前往此处的方法。