All packages
Opening Hours for Laravel
Importing week arrays
The widely used weekday-keyed array format is read natively, so switching from an older solution is a data import rather than a rewrite:
use RoundlyConsulting\OpeningHours\DataTransferObjects\CalendarData;
use RoundlyConsulting\OpeningHours\Facades\OpeningHours;
use RoundlyConsulting\OpeningHours\Validation\ParseOptions;
$data = CalendarData::fromWeekArray([
'monday' => ['09:00-12:00', ['hours' => '13:00-18:00', 'data' => 'Afternoon']],
'exceptions' => [
'2026-12-24' => [],
'12-25' => ['data' => 'Christmas'],
'2026-12-27 to 2026-12-30' => ['10:00-12:00'],
],
], new ParseOptions(mergeOverlapping: true));
OpeningHours::sync($clinic, $data); // or $clinic->setOpeningHours($data)- data on a range or a day is kept — a string becomes the label, an array the meta.
- Exception keys: Y-m-d (one-off), m-d (yearly), and Y-m-d to Y-m-d or m-d to m-d spans; [] or an entry without hours means closed.
- overflow is ignored — overnight ranges always run past midnight.
- With mergeOverlapping, a range that overlaps nothing is kept exactly as given; a merged range keeps a label, capacity or meta entry only when every range it absorbed agrees on it.
- filters is rejected (unsupported_week_array_feature) — use a DynamicExceptionProvider instead.
Validate before importing
WeekArrayParser returns a ParseResult instead of throwing, so one bad record doesn’t abort a batch import; violation paths use the legacy keys:
use RoundlyConsulting\OpeningHours\Validation\WeekArrayParser;
$result = WeekArrayParser::parse($weekArray); // ParseResult — never throws
$result->isValid();
$result->violations; // paths use the legacy keys: mon.0, exceptions.2026-12-24.0
$result->dataOrFail(); // CalendarDataShow your open-source love
This package is free and MIT-licensed. If it saves you time, a one-off donation or a Patreon membership keeps it maintained, tested and documented.
More ways to support, including cryptoBy donating, you agree to our donation terms.
Want this built into your product?
We integrate our packages into custom Laravel and AI builds. Tell us what you're working on and we'll reply within 48 hours.