====== Práca s termínmi ======
Termíny v SystemOmega sú ukladané v tabuľke **``st2_events``**.
Začiatok a koniec termínu je uložený ako [[wp>UTC]] ((Koordinovaný svetový čas alebo Coordinated Universal Time)) unixový čas ((Počet sekúnd od 1.1.1970)). Dalo by sa aj povedať, že sú uložené v časovom pásme ''+0000''. Je to prevencia proti problémom spojených so striedaním zimného a letného času.
Každá technológia, v ktorej sú umiestené termíny, má nastavené časové pásmo (v minútach), v ktorom sa nachádza. Napríklad technológie umiestnené v Bratislave majú časové pásmo ''+0100'', teda v databáze je uložené ''+60'' minút.
Pre získanie času termínu je potrebné používať funkcie pre prácu s UTC alebo GM časom. Napríklad v PHP namiesto funkcie ''date()'' použijeme ''gmdate()'', vo Flash namiesto ''Date().getHours()'' použijeme ''Date().getUTCHours()''.
V hlavnej konfigurácií SystemOmega ((''/local_settings/app.settings.php'')) sa nachádza položka ''**Default local TZO**'', kde sa definuje časová zóna servera v minútach. Týmto nastavením určujeme, ako sa budú prepočítavať lokálny čas, napr. ako vznikne pole ``event_local_date_start``.
Je jedno, či je letný alebo zimný čas, SystemOmega klient pri ukladaní rozoznáva aktuálne časové pásmo užívateľa((Je možné, že sa v budúcnosti v niektorých prehliadačoch vyskytne chyba, ktorá nesprávne vyhodnotí časové pásmo. V minulosti sa to stalo napr. v Chrome 22.)) a vypočíta, aby bol tento termín uložený správne bez ohľadu na aktuálny letný alebo zimný čas.
===== Polia v tabuľke `st2_events` =====
Niektoré polia súvisiace s časom:
^ Pole ^ Typ ^ Význam ^
| ``event_tzo`` | //int// | Časové pásmo v minútach, získané z technológie |
| ``event_date_start`` | //unsigned int// | Začiatok termínu ako UTC |
| ``event_date_end`` | //unsigned int// | Koniec termínu ako UTC |
| ``event_local_date_start`` | //datetime// | Začiatok termínu v lokálnom čase servera |
| ``event_local_date_end`` | //datetime// | Koniec termínu v lokálnom čase servera |
===== Príklad =====
Nachádzame sa v meste Bratislava, ktoré je v časovom pásme ''+0100''. Dokonca v letnom čase hovoríme o posune ''+0200'', ale našťastie to nebude problém.
Termín, ktorý ideme zapísať, sa začína ''**29.10.2014 o 08:00**''.
Tento čas sa následne prepočíta podľa nastavenia časovej zóny klienta a výsledkom bude UTC čas, ktorý sa do databázy uloží ako hodnota ''``event_date_start``=**1414566000**''.
echo gmdate("r (e)", 1414566000); // Wed, 29 Oct 2014 07:00:00 +0000 (UTC)
Ako je vidieť z výstupu, termín je naozaj uložený správne ako UTC čas. Ak by sme ho chceli v PHP správne zobraziť, musíme vedieť časové pásmo technológie, v ktorej je uložený (pole ``event_tzo``).
echo gmdate("r (e)", 1414566000 + (60 * 60)); // Wed, 29 Oct 2014 08:00:00 +0000 (UTC)
Potrebujeme časový posun v sekundách, takže ''60 * 60'' znamená 60 minút podľa TZO technológie (``event_tzo``) krát 60 sekúnd, keďže potrebujeme posun v sekundách.
Keby sme nepoužili UTC/GM funkcie, výsledok by bol odlišný a vôbec nie správny:
echo date("r (e)", 1414566000 + (60 * 60)); // Wed, 29 Oct 2014 09:00:00 +0100 (Europe/Bratislava)
===== Funkcie pre prácu v časom =====
==== PHP ====
==== Flash ====
==== MySQL ====
=== Prevod na lokálny dátum ===
SET `event_local_date_start` :=
CONVERT_TZ(
FROM_UNIXTIME(`event_date_start` + (`event_tzo` * 60)),
@@session.time_zone,
"+00:00"
);
=== Prevod z lokálneho dátumu ===
SET `event_date_start` :=
UNIX_TIMESTAMP(
CONVERT_TZ(
DATE_SUB(`event_local_date_start`, INTERVAL `event_tzo` MINUTE),
"+00:00", @@session.time_zone
)
);
Druhá metóda, snáď rýchlejšia:
SET `event_date_start` :=
UNIX_TIMESTAMP(
CONVERT_TZ(
`event_local_date_start`,
"+00:00",
@@session.time_zone
)
) - (`event_tzo` * 60);