spatie / opening-hours

Query and format a set of opening hours

Home Page:https://freek.dev/595-managing-opening-hours-with-php

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Date period in exceptions or start and end date for a set of days of the week in regular time

virthuz opened this issue · comments

Is it possible to inform a period of dates in the exceptions?

Or create more than one group of regular times, one of which is just for a date range, such as the summer months?

$openingHoursData = [
    'monday'     => ['09:00-12:00', '14:00-18:00'],
    'tuesday'    => ['09:00-12:00', '14:00-18:00'],
    'wednesday'  => ['09:00-12:00', '14:00-18:00'],
    'thursday'   => ['09:00-12:00', '14:00-18:00'],
    'friday'     => ['09:00-12:00', '14:00-18:00'],
    'saturday'   => [],
    'sunday'     => [],

   '12-20, 02-28' => [ **// Summer time from December 20th to February 28th**
    'monday'     => ['08:30-12:00', '13:30-20:00'],
    'tuesday'    => ['08:30-12:00', '13:30-20:00'],
    'wednesday'  => ['08:30-12:00', '13:30-20:00'],
    'thursday'   => ['08:30-12:00', '13:30-20:00'],
    'friday'     => ['08:30-12:00', '13:30-20:00'],
    'saturday'   => ['09:00-18:00'],
    'sunday'     => [],
    ],
    'exceptions' => [
    '2023-07-11' => ['08:00-11:00', '14:00-19:00'],
    '2023-12-25' => [],
    '2023-06-16'      => ['09:30-11:00','16:00-21:00'],                // Recurring on each 1st of January
    '12-25'      => ['09:00-12:00'],   // Recurring on each 25th of December
    ],
];
commented

Hello,

We don't have short-cut for that, so I see 3 options:

  • Generate with a loop the list of exceptions (you may use a DatePeriod from 12-20 to 02-28 and add the time depending of the current day of week, add it to the 'exceptions' array, then create the OpeningHours with it after.
  • Use 2 OpeningHours instances and swap between them depending on the date.
  • If you opening times matches a specific timezone with a DST change, then you can use offset (GMT+2) instead of named timezone (Europe/Berlin) or the reverse so the same hour:minute could apply all year long.

Dear contributor,

because this issue seems to be inactive for quite some time now, I've automatically closed it. If you feel this issue deserves some attention from my human colleagues feel free to reopen it.

@kylekatarnls i've a sort of the same use case, based on a contract that is valid for a period, we need to offer the opening hours.

Here is an example dataset:

$dataset = [
    [
        'period' => ['start' => '2023-01-01', 'end' => '2023-12-31'],
        'openingHours' => [
            'monday' => ['09:00-12:00', '13:00-17:30'],
            'tuesday' => ['09:00-12:00', '13:00-17:30'],
            'friday' => ['09:00-12:00', '13:00-17:30'],
        ],
    ], [
        'period' => ['start' => '2024-01-01', 'end' => '2024-03-31'],
        'openingHours' => [
            // ...
        ]
    ]
];

I tried using the exceptions-key, but that's only possible using the date to date, and not per day of week configurable.

commented

It falls in the option given above:

Use 2 OpeningHours instances and swap between them depending on the date.

Let's say you want to know if 2023-12-12 10:00 is open:

$dataset = [
    [
        'period' => ['start' => '2023-01-01', 'end' => '2023-12-31'],
        'openingHours' => OpeningHours::create([
            'monday' => ['09:00-12:00', '13:00-17:30'],
            'tuesday' => ['09:00-12:00', '13:00-17:30'],
            'friday' => ['09:00-12:00', '13:00-17:30'],
        ]),
    ], [
        'period' => ['start' => '2024-01-01', 'end' => '2024-03-31'],
        'openingHours' => OpeningHours::create([
            // ...
        ]),
    ],
];

function isOpen(array $dataset, DateTimeInterface $moment): bool
{
    foreach ($dataset as [
        'period' => ['start' => $start, 'end' => $end],
        'openingHours' => $openingHours,
    ]) {
        $date = $moment->format('Y-m-d');

        if ($date >= $start && $date < $end) {
            return $openingHours->isOpenAt($moment);
        }
    }

    return false; // default value if date does not match any period
}

var_dump(isOpen($dataset, new DateTimeImmutable('2023-12-12 10:00')));