gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:59:35 25 4
gpt4 key购买 nike

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

$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";

案例一:

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

服务 = 0 年 11 个月 30 天

案例二:

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

服务 = 1 年 0 个月 0 天

情况 1 似乎是不正确的。为什么是这样?是因为2016年是闰年吗?服务器运行 PHP v5.6。

最佳答案

这与您的时区设置和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

示例:

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

关于PHP diff() 给出不正确的值,其中 $date1 = '2016-03-01',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51982412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com