Я сталкиваюсь с некоторыми проблемами, пытаясь найти разницу между двумя датами. Например, у меня дата1 2015-09-14 и дата2 2015-09-18. Разница будет 5 дней, однако код возвращается 4 дня. Ниже приведен код:
$datetime1 = new DateTime($startdate);
$datetime2 = new DateTime($enddate);
$interval = $datetime1->diff($datetime2);
$ptohours = $interval->format('%d %H');
где начальная дата 2015-09-14 07:00:00
и окончание 2015-09-14 16:00:00
,
Я пытаюсь рассчитать часы, которые сотрудник запрашивает в качестве ВОМ. В приведенном выше примере это должно дать 45 часов.
Учитывая эти входные данные:
$startdate = '2015-09-14 07:00:00';
$enddate = '2015-09-18 16:00:00';
$datetime1 = new DateTime($startdate);
$datetime2 = new DateTime($enddate);
$interval = $datetime1->diff($datetime2);
$ptohours = $interval->format('%d %H');
print_r($interval);
Выход за четыре дня:
DateInterval Object
(
[y] => 0
[m] => 0
[d] => 4
[h] => 9
[i] => 0
[s] => 0
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] => 4
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)
Зачем?
Давайте составим карту с интервалом в двадцать четыре часа:
-14 07:00
a day has passed 1
-15 07:00
that's a day 2
-16 07:00
that's another day 3
-17 07:00
that's one more day 4
-18 07:00
not yet a full day
-18 16:00
Так что результат четырех дней технически верен.
Если вы считаете, что должны получать пять дней, то вы можете рассмотреть вопрос о применении такой формулы:
$adjustedDays = ceil($interval->d + $interval->h / 24.0);
Что даст вам то, что вы ищете.
Других решений пока нет …