Try Carbon

Options
BusinessTime::enable(Carbon::class, [ 'monday' => ['09:00-12:00', '13:00-18:00'], 'tuesday' => ['09:00-12:00', '13:00-18:00'], 'wednesday' => ['09:00-12:00'], 'thursday' => ['09:00-12:00', '13:00-18:00'], 'friday' => ['09:00-12:00', '13:00-20:00'], 'saturday' => ['09:00-12:00', '13:00-16:00'], 'sunday' => [], 'exceptions' => [ function (Carbon $date) { if ($date->isHoliday()) { // Or use ->isObservedHoliday() and set observed holidays: // https://github.com/kylekatarnls/business-day#setobservedholidayszone switch ($date->getHolidayId()) { // If the ID "christmas" exists in the selected holidays region and matches the current date: case 'christmas': return ['10:00-12:00']; default: return []; // All other holidays are closed all day long // Here you can also pass context data: return [ 'hours' => [], 'data' => [ 'reason' => 'Today is ' . $date->getHolidayName(), ], ]; } } // Else, typical day => use days of week settings }, ], ]); Carbon::setHolidaysRegion('us-national'); var_dump(Carbon::parse('2018-12-25 11:00')->isOpen()); // true matches custom opening hours of Christmas var_dump(Carbon::parse('2018-12-25 13:00')->isOpen()); // false var_dump(Carbon::parse('2019-01-01 11:00')->isOpen()); // false closed all day long var_dump(Carbon::parse('2019-01-02 11:00')->isOpen()); // true not an holiday in us-national region, so it's open as any common wednesday