这与您的时区设置有关闰年 https://en.wikipedia.org/wiki/Leap_year- 2016年2月有29天。间隔是使用 UTC 时区计算的,具体取决于您所在的时区DateTime
可能会评估到您可能期望的不同时间。例如,如果您正在使用Europe/Warsaw
时区,DateTime('2016-03-01')
(这与DateTime('2016-03-01 00:00:00')
) 将评估为2016-02-29 23:00:00
.
Sample:
date_default_timezone_set('Europe/Warsaw');
$date1 = '2016-03-01';
$date2 = '2017-03-01';
$datePay1 = new DateTime($date1);
$datePay2 = new DateTime($date2);
echo 'datePay1: ' . $datePay1->setTimezone(new DateTimeZone('UTC'))->format('Y-m-d H:i:s')
. "\ndatePay2: " . $datePay2->setTimezone(new DateTimeZone('UTC'))->format('Y-m-d H:i:s');
Result:
datePay1: 2016-02-29 23:00:00
datePay2: 2017-02-28 23:00:00
https://3v4l.org/mKNhX https://3v4l.org/mKNhX
正如你所看到的,你实际上是在比较2016-02-29 23:00:00
to 2017-02-28 23:00:00
。由于2月29日和2月28日之间相差一天,因此不被视为全年差异。
为了使其更加一致且独立于时区,请指定UTC
明确作为时区:
date_default_timezone_set('Europe/Warsaw');
$date1 = '2016-03-01';
$date2 = '2017-03-01';
$datePay1 = new DateTime($date1, new DateTimeZone('UTC'));
$datePay2 = new DateTime($date2, new DateTimeZone('UTC'));
$interval = $datePay1->diff($datePay2);
$vYears = $interval->y;
$vMonths = $interval->m;
$vDays = $interval->d;
echo "$vYears years, $vMonths months, $vDays days";
Result:
1 years, 0 months, 0 days
https://3v4l.org/lFnkL https://3v4l.org/lFnkL