date — Устранение разницы DateTime в переполнении стека

Я сталкиваюсь с некоторыми проблемами, пытаясь найти разницу между двумя датами. Например, у меня дата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 часов.

2

Решение

Учитывая эти входные данные:

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

Что даст вам то, что вы ищете.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]