PHP diff() 给出了不正确的值,其中 $date 1 = '2016-03-01'



我使用以下代码来确定一年内的员工服务:

$datePay1 = new DateTime($date1);
$datePay2 = new DateTime($date2);
$interval = $datePay1->diff($datePay2);
$vYears = $interval->y;
$vMonths = $interval->m;
$vDays = $interval->d;
$service = $vYears." years, ".$vMonths." months, ".$vDays." days"; 

案例1:

$date1 = '2016-03-01';
$date2 = '2017-03-01';

服务 = 0 年 11 个月 30 天

案例2:

$date1 = '2017-03-01';
$date2 = '2018-03-01';

服务 = 1 年 0 个月 0 天

案例 1 似乎不正确。这是为什么呢? 是因为2016年是闰年吗? 服务器运行 PHP v5.6。

这与您的时区设置和闰年有关 - 2016 年 2 月有 29 天。间隔是使用 UTC 时区计算的,根据您的时区,DateTime可能会评估为您可能期望的不同时间。例如,如果您使用的是Europe/Warsaw时区,则DateTime('2016-03-01')(与DateTime('2016-03-01 00:00:00')相同(的计算结果将为2016-02-29 23:00:00

样本:

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');

结果:

datePay1: 2016-02-29 23:00:00
datePay2: 2017-02-28 23:00:00

https://3v4l.org/mKNhX

如您所见,您实际上是在比较2016-02-29 23:00:002017-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";

结果:

1 years, 0 months, 0 days

https://3v4l.org/lFnkL

试试这个:

$tz = date_default_timezone_get();
$usa = 'America/Chicago'; // America/*
date_default_timezone_set($usa);
//Case 1:
$date1 = '2016-03-01';
$date2 = '2017-03-01';
//Case 2:
//$date1 = '2017-03-01';
//$date2 = '2018-03-01';
$datePay1 = new DateTime($date1);
$datePay2 = new DateTime($date2);
$interval = $datePay1->diff($datePay2);
$vYears = $interval->y;
$vMonths = $interval->m;
$vDays = $interval->d;
$service = $vYears." years, ".$vMonths." months, ".$vDays." days";
print_r($interval); // interval: + 1y
date_default_timezone_set($tz);

相关内容

最新更新