При попытке найти разницу между двумя датами я сталкиваюсь с некоторыми проблемами. В качестве примера у меня есть дата1 как 2015-09-14 и date2 как 2015-09-18. Разница составит 5 дней, однако код возвращается 4 дня. Ниже приведен код:
$datetime1 = new DateTime($startdate); $datetime2 = new DateTime($enddate); $interval = $datetime1->diff($datetime2); $ptohours = $interval->format('%d %H');
где startdate – 2015-09-14 07:00:00
а enddate – 2015-09-14 16:00:00
.
Я пытаюсь рассчитать часы, которые сотрудник запрашивает как PTO. В приведенном выше примере это должно дать 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);
Который даст вам то, что вы ищете.