Zpět na seznam článků RSS

Jak správně nastavit čas u iCalendar

iCal je textový standard pro zápis a sdílení kalendá­řových dat. Klasickou chybou programá­tora při zápisu událostí je vybodnout se na letní čas a zapsat timestamp stylem „to půjde“. V závis­losti na roční době a nastavení kalendáře příjemce to ale může jít až o dvě hodiny špatně.

Letní čas v EU

Letní, neboli takzvaný Daylight saving, čas v EU začíná poslední neděli v březnu a končí poslední neděli v říjnu, v obou případech v 01:00 (GMT).1 Od roku 1996 tuto konvenci dodržuje i Česká republi­ka, která měla dříve letní čas o měsíc kratší.

Středoe­vropský čas je od GMT posunut o +1 hodi­nu, letní čas přidává další hodinu na GMT+2h.

Datum a čas v iCalen­dar

Syntaxi standardu iCalendar2 probírat nebudu, zaměřme se na správný zápis času.3

1. Lokál­ní „plovou­cí“ formát

Neobsahu­je informaci o časové zóně, je relativní k „příjem­ci“. Silvestrov­ský přípitek tak bude o půlno­ci, lhostejno jestli ho bude importo­vat do kalendáře NewYorčan nebo Pražák — proto není tento formát vhodný k defini­ci události vázané k určité­mu místu.

20160101T000000

Určitý háček to ale má. Některé služby totiž plovoucí časové zóny nepodpo­rují. Například Google Calendar považuje lokální formát za GMT.

2. Abso­lutní GMT formát

Zde je čas zapsán pro Greenwichsk­ou časovou zónu. Zápis ukončuje písmeno Z. Na rozdíl od podobných formátů zde ale nemůže následo­vat jakýkoliv offset.

20151231T230000Z

Nevýhoda je zřejmá. Rozdíl oproti zóně GMT je nutné spočítat. A je nutné to udělat s ohledem na letní čas. Ideální je pro to objekt DateTime a DateTime­Zone, který má časové zóny podrobně definová­ny.4

$date = new DateTime('2016-01-01 00:00:00', new DateTimeZone('Europe/Prague'));
echo $date->setTimeZone(new DateTimeZone('GMT'))->format('Ymd\THis\Z');    // 20151231T230000Z

3. Lokál­ní formát s časovou zónou

TZID=Europe/Prague:20160101T000000

Časové pásmo je určeno identifi­kátorem TZID.

Samotná definice pásma je uvedena na začátku dokumentu jako blok VTIMEZO­NE:5 V našem případě v něm určujeme začátek a konec letního a standar­dního času a jejich rozdíl oproti GMT.

Nicméně vlastní definici pásem bude většina služeb (Google, Apple i Micro­soft) ignorovat. Google bere v potaz pouze definice pásem s nestan­dardizo­vaným4 identifi­kátorem. Microsoft definici vyžaduje vždy, i když ji z větší části ignoruje.

BEGIN:VTIMEZONE
TZID:Europe/Prague
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
DTSTART:19960331T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
DTSTART:19961027T030000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
END:VTIMEZONE

Reference

  1. Směrnice EP 2000/84­/ES — www.mpsv.cz
  2. RFC 5546: Internet Calenda­ring and Scheduling Core Object Specifi­cation (iCalen­dar) — tools.i­etf.org
  3. Property Value Data Types: Date-Time (RFC 5546) — tools.i­etf.org
  4. List of tz database time zones — en.wiki­pedia.org
  5. Calendar Componen­ts: Time Zone Component (RFC 5546) — tools.i­etf.org

Pokud není uvedeno jinak, podléhá obsah licenci CC BY-NC-ND a ukázkové zdrojové kódy CC BY.
Martin Hozík — , poslední úprava .