calculateDuration(); $weekDays = $this->calculateDuration(true); $weeks = $this->calculateDurationWeeks(); $durationModifierInDays = $durationModifier->durationModiferInDays(); return new DurationResult( days: $days * $durationModifierInDays, weeks: $weeks * ($durationModifier === DurationModifier::None ? 1 : $durationModifierInDays * 7), weekDays: $weekDays * $durationModifierInDays, ); } /** * @param string $intervalDuration * @param bool $skipWeekends * * @return int */ protected function calculateDuration(bool $skipWeekends = false): int { $interval = new DateInterval('P1D'); $period = new DatePeriod( $this->start, $interval, $this->end->add($interval), ); $intervalCount = 0; foreach ($period as $date) { if ($skipWeekends && !in_array($date->format('N'), self::WEEKDAYS)) { continue; } $intervalCount++; } return $intervalCount; } /** * @return int */ protected function calculateDurationWeeks(): int { return floor($this->start->diff($this->end)->days / 7); } }