NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Opening Hours for Laravel

Č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 hour

Samotné 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 kryptomien

Odoslaní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.