NewWe open-sourced 50+ Laravel packages
Custom AI apps, agents and automation — Roundly ConsultingRoundly
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();                          // CalendarData

Show 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 crypto

By 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.