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' => [ '2016-11-11' => ['09:00-12:00'], '2016-12-25' => [], '01-01' => [], // Recurring on each 1st of january '12-25' => ['09:00-12:00'], // Recurring on each 25th of december ], 'holidays' => [ 'region' => 'us-ny', // Load the official list of holidays from USA - New York 'with' => [ 'labor-day' => null, // Remove the Labor Day (so the business is open) 'company-special-holiday' => '04-07', // Add some custom holiday of your company ], ], ]); $date = Carbon::parse('2019-04-01 17:25'); var_dump($date->isOpen()); echo $date->nextClose()."\n"; $date = Carbon::parse('2019-04-01 18:25'); var_dump($date->isOpen()); echo $date->nextOpen()."\n"; // Exception for Christmas $date = Carbon::parse('2019-12-25 17:25'); var_dump($date->isOpen()); $date = Carbon::parse('2019-12-25 11:25'); var_dump($date->isOpen()); $date = Carbon::parse('2018-04-07 11:25'); var_dump($date->isBusinessOpen()); // use isBusinessOpen to consider holidays as closed all day long