Časové pásma a DST
Kalendár sa vyhodnocuje vo vlastnom časovom pásme → v openingHoursTimezone() vlastníka → v opening-hours.timezone → v app.timezone. Akceptujú sa len názvy IANA; pevné posuny ako +02:00 sa odmietnu výnimkou InvalidTimezoneException. withOutputTimezone() mení len to, ako sa okamihy zobrazia, nikdy nie samotnú odpoveď:
$hours = OpeningHours::for($clinic); // or $clinic->openingHours()
$hours->timezone(); // the zone the calendar is evaluated in
$hours->withOutputTimezone('UTC')->nextClose(); // same instant, reported in UTC
$visitor = $hours->withOutputTimezone('America/New_York');
$visitor->nextOpen(); // reported in New York time
$visitor->outputTimezone(); // DateTimeZone('America/New_York')Pravidlo hraníc
Každá hranica v miestnom čase sa riadi jedným pravidlom: zodpovedá prvému okamihu, v ktorom miestne hodiny ukazujú daný čas alebo neskorší.
- Posun dopredu (02:30 neexistuje): hranica 02:30 je okamih, keď hodiny skočia (03:00). Rozsah 01:00-02:30 v ten deň trvá jednu skutočnú hodinu.
- Posun dozadu (02:30 nastane dvakrát): platí prvý výskyt — pre začiatky aj konce, v každom pásme.
- Deň 00:00-24:00 trvá pri zmene času 23 alebo 25 hodín; trvanie je skutočný čas.
- Dátumy zadané ako okamihy sa najprv prevedú do pásma kalendára; deň v týždni je miestny.
use Carbon\CarbonImmutable;
use RoundlyConsulting\OpeningHours\OpeningHours;
// Europe/Bratislava falls back on Sunday 2026-10-25 (03:00 → 02:00)
$sundays = OpeningHours::make(['week' => ['sunday' => ['00:00-24:00']]], 'Europe/Bratislava');
$sunday = CarbonImmutable::parse('2026-10-25 00:00', 'Europe/Bratislava');
$sundays->openSecondsBetween($sunday, $sunday->addDay()); // 90000 — 25 real hours
// … and springs forward on Sunday 2026-03-29 (02:00 → 03:00)
$gap = OpeningHours::make(['week' => ['sunday' => ['01:00-02:30']]], 'Europe/Bratislava');
$period = $gap->currentPeriod(CarbonImmutable::parse('2026-03-29 01:30', 'Europe/Bratislava'));
$period?->end->format('c'); // 2026-03-29T03:00:00+02:00 — one real hourSamotné PHP vyhodnocuje nejednoznačné časy v rôznych pásmach rôzne, preto engine počíta hranice z tabuľky prechodov každého pásma. Je overený nezávislým brute-force orákulom na skutočných prechodoch — vrátane 30-minútového posunu (Australia/Lord_Howe), posunu +05:45 (Asia/Kathmandu), prechodu o polnoci (America/Santiago) a vynechaného dňa (Pacific/Apia).
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.