DateTime :: diff返回意外结果

问题描述 投票:-4回答:2

我有以下代码返回一个意外的答案。请让我知道什么是错的。

$start_date  = new DateTime('31-03-2019');
$end_date    = new DateTime('01-05-2019');
$d = $start_date->diff($end_date);
echo "day: " . $d->d . " month: " . $d->m . "\n";

它返回以下输出:

day: 0 month: 1

我希望输出为:

day: 1 month: 1
php datetime datediff
2个回答
0
投票

这将给你一天一个月https://3v4l.org/q0T8r

$start_date  = new DateTime('31-03-2019 00:00:00');
$end_date    = new DateTime('01-05-2019 24:00:00');
$d = $start_date->diff($end_date);
echo "day: " . $d->d . " month: " . $d->m . "\n";

0
投票

当你向2019-03-31添加1个月时,PHP将在内部将月值03增加到04。结果是2019-04-31

由于四月只有30天,2019-04-312019-05-01具有相同的含义。这就是为什么你得到一个月零天的原因。


DateInterval类有另一个方便的属性:days而不是md。它将包含两个日期之间的总天数,等于31(你需要在2019-03-31上添加31天才能到达2019-05-01

在这个值上,您可以实现自己的逻辑,即“一个月”。如果您将其定义为“一个月= 30天”,这可能是您的结果:

$start_date  = new DateTime('31-03-2019');
$end_date    = new DateTime('01-05-2019');
$diff = $start_date->diff($end_date);

$months = floor($diff->days / 30);
$days = $diff->days % 30;

echo "day: " . $days . " month: " . $months . "\n";
© www.soinside.com 2019 - 2024. All rights reserved.