DateTime :: diff奇怪的结果

问题描述 投票:0回答:4

我使用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"

Demo

php datetime datediff dateinterval
4个回答
1
投票

行为正确。两个日期间隔代表相同的天数(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日:

  • 您需要在10月21日前增加1个月29天才能达到12月20日(请注意,12月之前的月份有30天)
  • 但是,您需要从12月20日减去1个月30天才能达到10月21日。10月本身有31天,这可以解释两者之间的差异。

1
投票

为什么不从最大值中减去最小值?伪代码:

$diff = max($date1, $date2) - min($date1, $date2)

这样,您应该始终获得相同和正确的结果。


1
投票

结果似乎是有线的,但是是正确的:有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"

1
投票

好,请仅陈述我的评论作为答案。我的猜测是这是预期的行为,因为它的天数不同,具体取决于您前进还是后退。想象一下,从昨天到今天超过一年,那是366天,因为您必须四舍五入whole year plus 1 day。出于同样的原因,从今天到昨天(去年)只有364天,为whole year minus one day。至于解决方案,@ Andreas建议的选项是前往此处的方法。

© www.soinside.com 2019 - 2024. All rights reserved.